9

地图和收集有什么区别?下面的文档 - 我无法区分..


List.map<'T,'U> 函数

创建一个新集合,其元素是将给定函数应用于集合的每个元素的结果。

// 签名: List.map : ('T -> 'U) -> 'T list -> 'U list


List.collect<'T,'U> 函数

对于列表的每个元素,应用给定的函数。连接所有结果并返回组合列表。

4

3 回答 3

15

举例说明

假设您有一个列表列表:

let list = [ [1; 2]; [3; 4]; [5; 6] ]

和一个转换函数:

let trans = fun x -> [for i in x -> i*10]


List.map trans list将产生:

[[10; 20]; [30; 40]; [50; 60]]

尽管

List.collect trans list将产生:

[10; 20; 30; 40; 50; 60]


List.collect将应用转换函数,Concatenate结果List.map将只应用转换函数。

于 2013-09-14T18:40:26.603 回答
12

不同之处在于输出列表map的长度与输入列表的长度相同。对于collect,输出列表可能比输入更长或更短,因为您传递的函数返回一个列表而不是单个元素。

有关更多详细信息 - 比较签名。为了map

List.map : ('T -> 'U) -> 'T list -> 'U list

并收集

List.collect : ('T -> 'U list) -> 'T list -> 'U list

您可以在这里看到函数参数的返回类型不同。

于 2013-09-14T11:02:17.907 回答
11

添加到@John 的答案中,不同之处在于Concatenates.

基本上,List.collect f xs是一样的List.concat (List.map f xs)

于 2013-09-14T12:40:25.157 回答