2012-10-11 28 views

回答

5

讓我們來看看foldr的類型。

foldr :: (a -> b -> b) -> b -> [a] -> b 

既然你提供使用xy的功能,你可以從x是從你的列表([1,2,3])的值類型看,和y必須累加器值,你初始化第二個參數爲foldr

+0

[a,b,c,d] = (:) a ((:) b ((:) c ((:) d [])))'讓結果:: B;結果= foldr相似(\(X :: A) - > \(Y :: B) - >未定義:: B)(未定義: :b)([1,2,3] :: [a])' –

4

foldr定義是

foldr f z []  = z 
foldr f z (x:xs) = f x (foldr f z xs) 

您只需直接將其套用在你的榜樣:

foldr (\x y -> foo x y) z [1,2,3] 
= 
(\x y -> foo x y) 1 (foldr (\x y -> foo x y) z [2,3]) 
= 
foo 1 (foldr (\x y -> foo x y) z [2,3]) 

所以x1yfoldr (\x y ...) z [2,3])

一般來說,你能想到的foldr f z作爲一個清單,f替換每個(:),而[]z。所以foldr f z [a,b,c,d] = f a (f b (f c (f d z)))(因爲

+0

可能值得指出的是,這是foldr的功能性定義,並且它不一定以這種方式實現。 – Cubic

+1

是的,但是這個定義(從報告中)足以推理'foldr'的語義 – shachaf

+0

我知道它有點奇怪的回答一個問題幾個月後......但不是foldr從右開始摺疊?不是第一步是f 3 z? –