2012-07-08 62 views
4

weightDelta上运行hlint时,函数一直在提示Eta减小。我读了另一个相关的埃塔减少question,但我似乎无法将理解转移到这种情况。对Eta的理解减少

module StackQuestion where 

import qualified Data.Vector as V 

type Weights = V.Vector Double 
type LearningRate = Double 

weightDelta :: LearningRate -> Double -> Double -> Weights -> Weights 
weightDelta n r y ws = V.map update ws 
     where update w = diff * n * w 
       diff = r - y 

我试图将“减少”它指向自由语法的每一个变化都会使它断裂。 需要改变的地方在哪里,是否有任何直觉或诡计来避免将来减少eta的建议?

+0

请注意,一个eta-reduce转换适用于一个单一的参数,特别是最后的显式参数,在你的情况下是'ws'。 – 2012-07-08 09:06:02

+1

正如一个注释,这些减少(和更多)可以通过'pointfree'程序('cabal install pointfree')自动完成,因此您可以尝试测试/扩展您的理解。 (例如,它表示完全无点的版本是'weightDelta =(((V.map。(*))。)。)。(。( - ))。(。)。(*)'。) – huon 2012-07-09 07:52:08

回答

8

你不会轻易得到它的语法点,但你可以立即做什么只是η-减少ws了。

weightDelta :: LearningRate -> Double -> Double -> Weights -> Weights 
weightDelta n r y = V.map update 
     where update w = diff * n * w 
       diff = r - y 

你也可以这样做

 where update = (δ *) 
       δ = n * (r - y) 

但是这是相当值得商榷。

+0

不要发生这样的错误 - 不要将模块发布到你的问题中。你使用什么编译器? – leftaroundabout 2012-07-08 09:11:08

+3

你也可以写'update =(n *(r-y)*)'。 – sdcvvc 2012-07-08 13:38:15