Ocaml 中的 List.Fold_Left 类型系统?

标签 list ocaml 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;;

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

let list_print lst = List.fold_left (fun s -> print_string s) () lst;;

但这给了我

错误:此表达式的类型为 unit 但表达式应为 'a -> string

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

最佳答案

fold_left(和fold_right)的目的是在进行过程中积累一个值。额外的参数就是这个累加值。

您可以使用 List.iter 来解决您的问题。它积累值(value)。

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

let iter f = List.fold_left (fun () a -> f a) ()

要点(与 unit 一样)是该类型只有一个值,因此它表示该值不感兴趣的情况。

关于Ocaml 中的 List.Fold_Left 类型系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791786/

相关文章:

c++ - 如何删除 STD::List 中最近的 "Point"对象到某个 x,y?

python - 在Python中访问元组迭代列表中特定索引的正确方法

functional-programming - 具有多个文件的记录的可变字段

python - 遍历列表 - 分割字符串

html - 如何停止我的列表与标题图片重叠?

macros - OCaml 中的记录字段更新可以推广吗?

f# - The Little ML'er - F# 的良好培训?

matlab - 如何在 MATLAB 中将张量的维度折叠为标量

Haskell - Foldl 和 Foldr?

haskell - 为什么 foldr 对 Haskell 中的元组不懒惰