您想使用List.fold_left
,这很好,但您应该从阅读该函数的文档开始。官方文档很短:
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
List.fold_left f a [b1; ...; bn] is f (... (f (f a b1) b2) ...) bn.
首先是该函数的类型。类型是
('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
换句话说,该函数fold_left
具有三个参数和一个结果值。第一个参数有 type ('a -> 'b -> 'a)
。第二个参数有 type 'a
。第三个参数有 type 'b list
。函数的结果值类型为'a
。
现在,在您的情况下,您想要打印字符串。所以你实际上不需要任何结果值,你需要一个副作用。但是,在 OCaml 中,所有函数都必须有一个结果值。因此,您使用空值 ,()
它的类型为unit
。因此,在您的情况下,类型参数'a
将等于unit
。
类型参数'b
是string
因为您需要处理字符串列表。
因此,在您的情况下,函数fold_left
必须具有类型
(unit -> string -> unit) -> unit -> string list -> unit.
的第一个参数fold_left
必须具有类型unit->string->unit
。换句话说,它必须是一个有两个参数的函数,第一个参数是空值,即()
,第二个参数是一个字符串。所以第一个参数fold_left
必须是这种函数,
fun x y -> ...
wherex
必须是 typeunit
和y
type string
。因为x
总是等于()
,所以没有必要把这个参数写成一个变量x
,相反我们可以简单地写()
甚至是哑参数_
。(语法fun x -> fun y -> ...
提供与 相同的功能fun x y -> ...
。)
现在你可以开始弄清楚 fold_left 是如何工作的。由于这显然是一个家庭作业问题,我将把这个任务留给你。