2012-07-08 67 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