2011-11-25 36 views
7

我還在努力破解這個代碼:在Haskell中,爲什麼我必須在這段代碼中使用美元符號?

import Data.Char 
groupsOf _ [] = [] 
groupsOf n xs = 
    take n xs : groupsOf n (tail xs) 

problem_8 x = maximum . map product . groupsOf 5 $ x 
main = do t <- readFile "p8.log" 
     let digits = map digitToInt $concat $ lines t 
     print $ problem_8 digits 

problem_8 x = maximum . map product . groupsOf 5 $ x 爲什麼不能把它僅僅是groupsOf 5×? 是因爲x後來會擴展到其他一些表達式(這裏是:digits = map digitToInt $concat $ lines t)?這就是所謂的懶惰(x現在不會擴大,但也許以後)?

回答

15

沒有$,優先級作品出這樣的:

maximum . map product . (groupsOf 5 x) 

.由於(功能組合物)採用兩個函數作爲參數,並groupsOf 5 x不能返回的函數,這是一個錯誤。

隨着$,優先級作品出這樣的:

(maximum . map product . groupsOf 5) x 

這相當於(通過功能的組合物)到:

maximum (map product (groupsOf 5 x)) 

或:

maximum $ map product $ groupsOf 5 x 

(但是沿着$這樣被認爲是不好的風格)

這與懶惰無關,請注意。

+0

謝謝。你是什​​麼意思:既然。 (函數組合)以兩個函數作爲參數,?在「groupsOf 5」中,5被認爲是一個函數? – osager

+0

無論如何,非常適合指出點預期的功能,而不是列表或任何數據類型的東西。 – osager

+0

不,'(groupsOf 5)'是一個函數 – bdonlan

5

正如bdonlan所說,$function application.functional composition

使用hoogle來搞清楚某些關鍵字正在做什麼。它也可能有助於顯示函數簽名和模塊名稱。

+0

「功能應用程序」使其聽起來很花哨......它實際上只是專用於函數類型的身份函數。 – Prateek

8

你不使用$,事實上,你永遠必須使用它。

在你的情況下,毫無意義的^ H^H^H^Hsfree符號暗示自己:與其

problem_8 x = maximum . map product . groupsOf 5 $ x 

這相當於:

problem_8 x = (maximum . map product . groupsOf 5) x 

我們可以離開了x上方程兩邊:

problem_8 = maximum . map product . groupsOf 5 
+1

耶,eta減少!強烈建議[hlint](http://hackage.haskell.org/package/hlint)提供此類建議。 –

+0

有幾種情況下使用'$'是唯一的方法來做某件事情,比如當你將它傳遞給一個更高階的函數時。 –

相關問題