2014-05-10 42 views

回答

5

如果您在使用命令式語言如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 
+2

而對於有人用ML背景,Haskell的'foldr'有一個參數。 – dfeuer

+0

@dfeuer從技術上講,它在Haskell中也有一個參數,但我發現這個解釋對'foldr'毫無意義,因爲你通常要指定* both * combination function *和* identity元素。您很少想要指定組合函數,然後讓其他人決定標識元素,因爲常見的二元操作具有固有的標識元素。鑑於一個可摺疊的實例有一個可能的最小的foldMap實現,我感覺它將附加操作和標識元素分組很有意義。 – kqr

+3

這不是身份值;它是默認值。 'foldr(:) []'和'fol​​dr(:) [1,2,3]'都是有道理的。 –

相關問題