OCaml默认折叠左实现:关于语法的问题
我正在学习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开头的元素,该列表传递给左折叠
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
将是一种产品。也可以是你想要的任何东西。这就是为什么它被称为累加器,而不仅仅是求和。