彙總列表中的資料

List.fold_leftList.fold_right 函式是實現列表聚合的外部邏輯的高階函式。聚合列表(有時也稱為減少列表)意味著計算從對該列表中的所有專案的順序檢查匯出的值。

List 模組文件說明了這一點

  • List.fold_left f a [b1; ...; bn]f (... (f (f a b1) b2) ...) bn
  • List.fold_right f [a1; ...; an] bf 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_leftList.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

這些示例旨在成為學習材料,這些實現與標準庫中的相應功能相比沒有任何優點。