地图和收藏有什么区别?下面的文件 - 我无法区分......
List.map<' T,' U>功能
创建一个新集合,其元素是将给定函数应用于集合的每个元素的结果。
//签名: List.map :(' T - >' U) - > ' T列表 - > ' U列表
List.collect<' T,' U>功能
对于列表的每个元素,应用给定的函数。连接所有结果并返回组合列表。
答案 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 xs
与List.concat (List.map f xs)
相同。