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

时间:2016-03-02 02:35:10

标签: functional-programming 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和函数式编程的新手。

2 个答案:

答案 0 :(得分:7)

List.map返回根据调用提供的函数的结果形成的新列表。 List.iter只返回(),这是一个特别无趣的价值。即,List.iter适用于您只想调用不返回任何有趣内容的函数。在您的示例中,Printf.printf实际上并未返回有趣的值(它返回())。

尝试以下方法:

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

答案 1 :(得分:3)

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

List.map获取一个类型的列表,并将其每个值一次放入一个函数中,并使用这些结果填充另一个列表,因此运行List.map (string_of_int) [1;2;3]等同于以下内容: / p>

[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使用列表中的每个元素来查看已完成的内容。