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

Car*_*ngo 9 collections f#

地图和收藏有什么区别?下面的文档 - 我不能说出差异..


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

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

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


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

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

pol*_*ran 14

举例说明

假设您有一个列表列表:

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


Joh*_*mer 10

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

有关更多详细信息 - 请比较签名.对于map

List.map : ('T -> 'U) -> 'T list -> 'U list
Run Code Online (Sandbox Code Playgroud)

并收集

List.collect : ('T -> 'U list) -> 'T list -> 'U list
Run Code Online (Sandbox Code Playgroud)

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


Mis*_*hor 10

加入@ John的答案,区别在于这个词Concatenates.

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