Ocaml中的List.Fold_Left类型系统?

JBa*_*low 2 ocaml list fold higher-order-functions

编写一个Ocaml函数list_print : string list -> unit,从左到右打印列表中的所有字符串:

所以让我们说我有一个Ocaml函数list_print: string list -> unit可以打印从左到右的列表中的所有字符串.现在正确的解决方案是:

let list_print lst = List.fold_left (fun ( ) -> fun s -> print_string s) () lst;;
Run Code Online (Sandbox Code Playgroud)

但在编写我的解决方案时,我是这样编写的:

let list_print lst = List.fold_left (fun s -> print_string s) () lst;;
Run Code Online (Sandbox Code Playgroud)

但这给了我

错误:此表达式具有类型单位,但表达式需要类型为"a - > string"

为什么在乐趣之前我需要第一个参数fun() - >?我还是Ocaml的新手,所以这种类型的系统让我很困惑

Jef*_*eld 8

fold_left(和fold_right)的目的是随着你的进展积累一个值.额外参数是此累计值.

您可以使用List.iter您的问题.它不会累积值.

您可以将其List.iter视为List.fold_left累积值类型的版本unit.事实上,你可以这样实现它:

let iter f = List.fold_left (fun () a -> f a) ()
Run Code Online (Sandbox Code Playgroud)

点(一如既往unit)是该类型只有一个值,因此它表示值不感兴趣的情况.