我正在学习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
是跟踪折叠总和的累加器。 a
是l
开头的元素,该列表传递给fold_left
。为什么将累加器传递给f
?它不是累加器与f a
的返回值之和吗?
所有这些如何返回单个int
,即应该是累加器的状态?
答案 0 :(得分:1)
弃牌是很普遍的,不仅仅是为了加注数字。
函数f
可以是任何函数,该函数可以使用(任何类型的)累积值和列表中的新值,并返回新的累积值。那是唯一的要求。
您可以想象fold_left f init [a; b; c; d]
是写此表达式的一种简短方法:
f (f (f (f init a) b) c) d
同样,f
可以是类型对于累积值和列表元素正确的任何函数。