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

时间:2018-10-22 18:21:36

标签: ocaml fold

我正在学习OCaml。目前,我正在查看一些默认的List迭代器实现,而对于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是传递给fold_left的函数,应应用于列表中的每个元素。
  • accu是跟踪折叠总和的累加器。
  • al开头的元素,该列表传递给fold_left

为什么将累加器传递给f?它不是累加器与f a的返回值之和吗?

所有这些如何返回单个int,即应该是累加器的状态?

1 个答案:

答案 0 :(得分:1)

弃牌是很普遍的,不仅仅是为了加注数字。

函数f可以是任何函数,该函数可以使用(任何类型的)累积值和列表中的新值,并返回新的累积值。那是唯一的要求。

您可以想象fold_left f init [a; b; c; d]是写此表达式的一种简短方法:

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

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