我遇到了这个功能: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.map
和List.iter
之间的区别吗?
注意:我是OCaml和函数式编程的新手。
答案 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
使用列表中的每个元素来查看已完成的内容。