OCaml 中 List.iter 和 List.map 函数的区别

Difference between List.iter and List.map function in OCaml

我遇到了这个函数:List.map。我的理解是 List.map 将函数和列表作为参数并转换列表中的每个元素。

List.iter 做了类似的事情(也许?),参考下面的例子。:

# let f elem =
Printf.printf "I'm looking at element %d now\n" elem in
List.iter f my_list;;
I'm looking at element 1 now
I'm looking at element 2 now
I'm looking at element 3 now
I'm looking at element 4 now
I'm looking at element 5 now
I'm looking at element 6 now
I'm looking at element 7 now
I'm looking at element 8 now
I'm looking at element 9 now
I'm looking at element 10 now
- : unit = ()

有人可以解释一下 List.mapList.iter 之间的区别吗?

注意:我是 OCaml 和函数式编程的新手。

List.map returns 一个新列表,由调用提供的函数的结果形成。 List.iter 只是 returns (),这是一个特别无趣的值。也就是说,List.iter 适用于当您只想调用一个 return 没有任何意义的函数时。在您的示例中,Printf.printf 实际上并不是 return 一个有趣的值(它 return 是 ())。

尝试以下操作:

List.map (fun x -> x + 1) [3; 5; 7; 9]

Jeffrey 已经相当彻底地回答了这个问题,但我想详细说明一下。

List.map 采用一种类型的列表,一次将其每个值通过一个函数,然后用这些结果填充另一个列表,因此 运行 List.map (string_of_int) [1;2;3] 是相当于以下内容:

[string_of_int 1; string_of_int 2; string_of_int 3]
另一方面,

List.iter 应该在您只需要函数的副作用时使用(例如 let s = ref 0 in List.iter (fun x -> s := !s + x) [1;2;3],或者您在代码中给出的示例)。

总而言之,当您希望看到已完成的某件事时,请使用 List.map 列表中的每个元素,当您想要时,请使用 List.iter喜欢看到用列表中的每个元素完成的事情。