【发布时间】:2013-09-14 11:01:12
【问题描述】:
地图和收集有什么区别?下面的文档 - 我无法区分..
List.map 函数
创建一个新集合,其元素是将给定函数应用于集合的每个元素的结果。
// 签名: List.map : ('T -> 'U) -> 'T 列表 -> 'U 列表
List.collect 函数
对于列表的每个元素,应用给定的函数。连接所有结果并返回组合列表。
【问题讨论】:
标签: collections f#
地图和收集有什么区别?下面的文档 - 我无法区分..
List.map 函数
创建一个新集合,其元素是将给定函数应用于集合的每个元素的结果。
// 签名: List.map : ('T -> 'U) -> 'T 列表 -> 'U 列表
List.collect 函数
对于列表的每个元素,应用给定的函数。连接所有结果并返回组合列表。
【问题讨论】:
标签: collections f#
不同之处在于map 的输出列表与输入列表的长度相同。对于collect,输出列表可能比输入更长或更短,因为您传递的函数返回一个列表而不是单个元素。
更多细节 - 比较签名。对于map
List.map : ('T -> 'U) -> 'T list -> 'U list
收集
List.collect : ('T -> 'U list) -> 'T list -> 'U list
这里可以看到函数参数的返回类型不同。
【讨论】:
List.collect 也称为flatMap(在其他语言中)。参考F# Friday – The collect Function
举例说明
假设您有一个列表列表:
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 将仅应用转换函数。
【讨论】:
除了@John 的回答,区别在于Concatenates 这个词。
基本上,List.collect f xs 与 List.concat (List.map f xs) 相同。
【讨论】: