彙總列表中的資料
List.fold_left
和 List.fold_right
函式是實現列表聚合的外部邏輯的高階函式。聚合列表(有時也稱為減少列表)意味著計算從對該列表中的所有專案的順序檢查匯出的值。
List.fold_left f a [b1; ...; bn]
是f (... (f (f a b1) b2) ...) bn
。List.fold_right f [a1; ...; an] b
是f a1 (f a2 (... (f an b) ...))
。 (後一種函式不是尾遞迴的。)
用簡單的英語計算 List.fold_left f a [b1; ...; bn]
相當於通過列表 [b1; ...; bn]
保持跟蹤執行蓄能器初始設定為 a
:每次我們在列表中看到一個專案的時候,我們用 f
更新累加器的價值,當我們做了,累加器是我們計算的最終值。List.fold_right
功能類似。
以下是一些實際示例:
計算數字列表的總和
List.fold_left ( + ) 0 lst
計算浮動列表的平均值
let average lst =
let (sum, n) =
List.fold_left (fun (sum, n) x -> (sum +. x, n + 1)) (0.0, 0) lst
in
sum /. (float_of_int n)
重新實現基本列表處理
函式 List.fold_left
和 List.fold_right
非常通用,它們可用於實現列表模組中幾乎所有其他函式:
let list_length lst = (* Alternative implementation to List.length *)
List.fold_left ( + ) 0 lst
let list_filter predicate lst = (* Alternative implementation to List.filter *)
List.fold_right (fun a b -> if predicate a then a::b else b) lst []
甚至可以重新實現 List.iter
函式,記住 ()
是程式的全域性狀態,將此程式碼解釋為列表聚合的另一個示例 :
let list_iter f lst = (* Alternation implementation to List.iter *)
List.fold_left (fun () b -> f b) () lst
這些示例旨在成為學習材料,這些實現與標準庫中的相應功能相比沒有任何優點。