list.map和list.collect之间的区别

时间:2013-09-14 11:01:13

标签: collections f#

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


List.map<' T,' U>功能

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

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


List.collect<' T,' U>功能

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

3 个答案:

答案 0 :(得分:13)

举例说明

我们假设你有一份清单清单:

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将仅应用转换函数。

答案 1 :(得分:10)

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

更多细节 - 比较签名。对于map

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

并收集

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

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

答案 2 :(得分:10)

添加@ John的答案,区别在于Concatenates

基本上,List.collect f xsList.concat (List.map f xs)相同。