2017-07-19 36 views
1

我試圖寫這個函數施加組合物和局部應用與Haskell中:添加具有組合物和局部應用的Haskell值

function m n = (m^2) + n 

我試圖與:

function m = (m^2).(+) 
+0

你想用第二個做什麼?當你嘗試時會發生什麼? –

+0

這是錯的。請看看Willem的回答 – cde33

回答

4

的問題該方法是(+)是一個二元運算符。由於您將其放在點.的右側,因此它不會應用於左操作數。所以,你已經寫了:

function :: Num a => a -> a -> a 
function m = (.) (m^2) (+) -- wrong 

這是短期的:

function m = \n -> ((m^2) ((+) n)) 

這樣就意味着(+) n將導致功能(n+),我們將應用功能的(m^2)結果,這不很有意義。

但是,您可以簡單地使用:

function :: Num a => a -> a -> a 
function m = (+) (m^2) 

或者:

function :: Num a => a -> a -> a 
function m = ((m^2) +) 

鑑於function m = (+) (m^2),如果我們對功能應用n,我們將獲得:

((+) (m^2)) n 
-> (+) (m^2) n 
-> (m^2) + n 

你可以進一步修改function並刪除m論證以及與:

function :: Num a => a -> a -> a 
function = (+) . (^ 2) 

這是語法糖:

function :: Num a => a -> a -> a 
function = (.) (+) (^2) 

如果我們現在在功能應用m,它會評估爲:

((.) (+) (^2)) m 
-> (\x -> (+) ((^2) x)) m 
-> (+) ((^2) m) 
-> (+) (m^2) 

所以我們獲得像上一個命令一樣的狀態。

+1

謝謝@Willem Van Onsem – cde33