OCaml默认折叠左实现:关于语法的问题

OCaml默认折叠左实现:关于语法的问题,ocaml,fold,Ocaml,Fold,我正在学习OCaml。目前,我正在研究一些列表的默认迭代器实现,我对左折叠的一部分有点困惑 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是跟踪折合金额的累加器 a是l开头的元素,该列表传递给左折叠

我正在学习OCaml。目前,我正在研究一些列表的默认迭代器实现,我对左折叠的一部分有点困惑

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
    是跟踪折合金额的累加器
  • a
    l
    开头的元素,该列表传递给
    左折叠
为什么要将累加器传递到
f
?它不应该是累加器和fa的返回值之和吗


所有这些是如何返回一个单一的
int
,这就是累加器应该是什么(假设)?

折叠是完全通用的,它不仅仅是用于相加数字

函数
f
可以是从列表中获取累积值(任何类型)和新值并返回新累积值的任何函数。这是唯一的要求

您可以将
左折叠f init[a;b;c;d]
想象为编写此表达式的一种简单方法:

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

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

关键是该函数不需要是一个直和函数。如果要将列表中的所有值相乘,该怎么办?你描述的方式不支持
f
接受正在运行的总值和当前值,并允许用户选择如何累积这些值。@clcto哦,那么我可能会误解。我认为它是
for(集合中的项)sum+=func(项)但是你说它更像是(集合中的项)sum func项的
?它更像是
for(集合中的项目)accu=func(accu,项目)
,其中
func(accu,项目)
可以是
accu+项目
,在这种情况下
accu
将是一个总和。或者它可以是
accu*项目
,在这种情况下
accu
将是一种产品。也可以是你想要的任何东西。这就是为什么它被称为累加器,而不仅仅是求和。