OCaml 默认 fold_left 实现:关于语法的问题

OCaml default fold_left implementation: question about syntax

我正在学习 OCaml。目前,我正在研究列表的一些默认迭代器实现,我对 fold_left.

的一部分有点困惑
let rec fold_left f accu l =
  match l with
    [] -> accu
  | a::l -> fold_left f (f accu a) l

我感到困惑的部分是 (f accu a)。我会按照我的理解来分解它。

为什么要将累加器传递给 f?不应该是累加器和f a的return值之和吗?

所有这些 return 如何成为一个 int,这就是累加器应该是什么(假设)?

折叠是完全通用的,它不仅仅是为了加法。

函数 f 可以是从列表中获取一个累加值(任何类型)和一个新值的任何函数,returns 一个新的累加值。这是唯一的要求。

您可以将 fold_left f init [a; b; c; d] 想象成一个简短的写法:

f (f (f (f init a) b) c) d

同样,f 可以是任何函数,其类型对于累加值和列表元素是正确的。