【问题标题】:Difference between List.iter and List.map function in OCamlOCaml 中 List.iter 和 List.map 函数的区别
【发布时间】:2016-03-03 08:17:11
【问题描述】:

我遇到了这个函数: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 和函数式编程的新手。

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

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

    尝试以下方法:

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

    【讨论】:

      【解决方案2】:

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

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

      [string_of_int 1; string_of_int 2; string_of_int 3]
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2014-04-05
        • 2023-01-20
        • 2015-09-27
        相关资源
        最近更新 更多