2013-09-29 23 views
7

至少有兩件事情我不明白它:從左側到右側摺疊爲什麼foldBack的簽名與F#中的摺疊有很大不同?

  • 重構需要大量的不僅是簽名,但在每一個地方的變化依賴於文件夾功能
  • 沒有辦法就到列表鏈它沒有翻轉參數

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State

List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State

任何好的理由爲什麼會有人把所有參數相反在foldBack簽名相比fold

+0

對你的編輯:這只是像一個咆哮。另外,如果不破解大量的代碼,它永遠不會被改變 –

+1

我認爲簽名會自然地讀出來,只要你有正確的心智模型。還有一種懶惰的語言,有很好的理由讓這些人分開。但我認爲這是一個有效的問題。 – nicolas

回答

9

這只是一個有用的記憶,以幫助程序員記住名單是如何重複。想象一下,你的清單是從左側開始到右側結束的。 fold以左邊的初始狀態開始並且累積狀態向右。 foldBack做了相反的處理,它從右側的初始狀態開始,然後回到列表的左側。

這絕對是展示F#的OCaml的遺產,其他一些函數式語言(Haskell中,斯卡拉,ML)保持列表作爲最後一個參數,以允許更多的公共部分的應用場景。

如果我真的需要一個版本的foldBack,看上去酷似fold,我會定義自己的輔助函數:

module List = 
    let foldBack' f acc lst = 
    let flip f a b = f b a 
    List.foldBack (flip f) lst acc 
+0

*保持列表作爲最後一個參數,以允許更多的公共部分的應用場景*以及這恰恰不是這樣的,當談到在F#至折返 –

+1

是的,這就是他說。 –

3

這是F#的OCaml中開始的遺物。你可以看到,對於List.foldList.foldBack的F#函數簽名是the OCaml documentation一樣(他們分別被稱爲List.fold_leftList.fold_right)。

相關問題