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.map
和 List.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
喜欢看到用列表中的每个元素完成的事情。
我遇到了这个函数: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 和函数式编程的新手。
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
喜欢看到用列表中的每个元素完成的事情。