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
是传递给 fold_left
的函数,它应该应用于列表中的每个元素。
accu
是跟踪折叠总和的累加器。
a
是l
头部的元素,传递给fold_left
. 的列表
为什么要将累加器传递给 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
可以是任何函数,其类型对于累加值和列表元素是正确的。
我正在学习 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
是传递给fold_left
的函数,它应该应用于列表中的每个元素。accu
是跟踪折叠总和的累加器。a
是l
头部的元素,传递给fold_left
. 的列表
为什么要将累加器传递给 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
可以是任何函数,其类型对于累加值和列表元素是正确的。