如果您在使用命令式語言如Java和Python的經驗,你可以這樣查看:
foldr
有三個參數:一個函數,一個身份值和一個列表。然後它返回一個累計值。
你說得對,a -> b -> b
是功能,而b
是身份值。然後[a]
是列表,第二個b
是返回值,它是該函數的結果。這
例子:
function
| identity value
| | list
| | |
v v v
> foldr (*) 1 [1, 2, 3, 4]
24 <-- return value
如果你有函數式編程經驗,你可能反而要查看它是這樣的:
foldr
有兩個參數:一個結合功能和身份價值。然後它返回一個函數,該函數接受一個列表並返回一個累計值。
在這種情況下,a -> b -> b
仍然是組合功能,b
是標識值。返回值然後變爲[a] -> b
,這是一個列表並返回一個累計值的函數。這
例子:
combining function
returned function | identity value
| | |
v v v
> let multiply = foldr (*) 1
> -- since the returned function is of type [a] -> b, we give
> -- it a list and it gives us the accumulated value back
> multiply [1, 2, 3, 4]
24
來源
2014-05-10 08:25:54
kqr
而對於有人用ML背景,Haskell的'foldr'有一個參數。 – dfeuer
@dfeuer從技術上講,它在Haskell中也有一個參數,但我發現這個解釋對'foldr'毫無意義,因爲你通常要指定* both * combination function *和* identity元素。您很少想要指定組合函數,然後讓其他人決定標識元素,因爲常見的二元操作具有固有的標識元素。鑑於一個可摺疊的實例有一個可能的最小的foldMap實現,我感覺它將附加操作和標識元素分組很有意義。 – kqr
這不是身份值;它是默認值。 'foldr(:) []'和'foldr(:) [1,2,3]'都是有道理的。 –