讀「真實世界哈斯克爾」,95頁的作者提供了一個例子:函數獲取四個參數而不是三個 - 爲什麼不打破?
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
我的問題是:爲什麼這個代碼編譯? foldr
只需要三個參數 - 但在這裏,它通過四個:step
,id
,xs
,z
。
例如,這不起作用(因爲總和預計一個):
sum filter odd [1,2,3]
相反,我必須寫:
sum $ filter odd [1,2,3]
我不明白你爲什麼可以做'id id 5',但是你不能這樣做:'foo x = x + 1;條y = y + 1; foo bar 1'? – drozzy 2012-02-11 23:46:32
@drozzy - 這一切都是關於類型和多態的。以'id :: a - > a':你可以用* any替換'a'。然而,'foo'是不同的,因爲它有約束:它需要一個數字:'foo ::(Num a)=> a - > a'。 'bar ::(Num a)=> a - > a'不是'Num'類型類型的實例,因此不符合'foo'的'(Num a)'約束。 – 2012-02-11 23:51:03
@drozzy如果我們澄清函數應用程序的關聯性,也許會有所幫助!請記住'id id 5'解析爲'(id id)5' - 也就是說,首先將'id'作爲'id'的參數,然後將'5'作爲結果的參數 - 而不是' id(id 5)'。 – 2012-02-12 01:26:09