.net 使用List.collect f#

.net 使用List.collect f#,.net,f#,functional-programming,.net,F#,Functional Programming,我试图定义一个函数,该函数接受两个列表,并使用List.collect将它们组合在一起 let concat xs xs' = let concatList = List.collect xs xs' printfn "%A" concatList concat [1;2;3;4] [5;6;7;8] 我收到错误消息: FS0001:此表达式应具有类型“a->”b列表 但这里有类型“c列表” 我读到这可能是由于缺少参数,但我不确定这一点 编辑: 所以我有点像这样工作:

我试图定义一个函数,该函数接受两个列表,并使用List.collect将它们组合在一起

let concat xs xs' = 
    let concatList =  List.collect xs xs'
    printfn "%A" concatList

concat [1;2;3;4] [5;6;7;8]
我收到错误消息: FS0001:此表达式应具有类型“a->”b列表 但这里有类型“c列表”

我读到这可能是由于缺少参数,但我不确定这一点

编辑:

所以我有点像这样工作:

 let concat xs xs' = 
    let concatList =  List.collect (fun x -> xs @ xs') xs
    printfn "%A" concatList

concat [1;2;3;4] [5;6;7;8]
let concat xs xs' = 
    let combList = [[xs];[xs']]
    let concatList =  List.collect id combList
    printfn "%A" concatList

concat [1;2;3;4] [5;6;7;8]
但输出是:[1;2;3;4;5;6;7;8;1;2;34;5;6;7;8;1;2;34;5;6;7;8;1;1;2;3;4;5;6;7;8;]

只希望它是[1;2;34;5;6;7;8;] 你知道为什么它会运行这么多次吗

编辑2:

所以我让它像这样工作:

 let concat xs xs' = 
    let concatList =  List.collect (fun x -> xs @ xs') xs
    printfn "%A" concatList

concat [1;2;3;4] [5;6;7;8]
let concat xs xs' = 
    let combList = [[xs];[xs']]
    let concatList =  List.collect id combList
    printfn "%A" concatList

concat [1;2;3;4] [5;6;7;8]

正如您在注释中所指出的,
List.collect
将函数应用于列表的每个元素。然后,它连接结果并返回一个组合列表。第二种行为将允许您产生类似于
List.concat
的行为

我们需要做些什么来实现这一目标

让我们看看文档示例:

let list1 = [10; 20; 30]
let collectList = List.collect (fun x -> [for i in 1..3 -> x * i]) list1
printfn "%A" collectList
//Output
//[10; 20; 30; 20; 40; 60; 30; 60; 90]
本例中发生的情况是,对于
list1
的每个元素,我们都应用函数
(fun x->[对于1..3中的i->x*i])
。这给我们提供了与使用
List.map
相同的结果。结果是
[[10;20;30];[20;40;60];[30;60;90]
,然后通过
列表连接。收集
到上面的最终结果中

现在,关于你的问题,让我们考虑一个相关的问题。假设我们得到一个列表,如

let x = [[10; 20; 30]; [20; 40; 60]; [30; 60; 90]]
如何使用
List.collect
将它们连接起来以获得输出
[10;20;30;20;40;60;30;60;90]

因此,
List.collect
需要一个函数和一个列表。我们可以传入上面定义的列表列表,
x
,但是我们仍然需要一个函数来进行映射。然而,我们并不想对
x
的元素进行任何转换,我们只想按原样使用它们,这意味着我们应该使用
id
。然后使用

List.collect id x

将返回所需的结果。您的具体问题与上述问题非常相似,应该不会太难解决。

这不是
List.collect
的功能。你是说List.concat吗?我觉得List.concat更有意义。但是我被告知不要使用它。阅读关于List.collect的文章,它说:“对于列表中的每个元素,应用给定的函数。连接所有结果并返回组合列表。”那么问题出在哪里呢?您发布的描述是“应用给定的函数”。你在哪里做活动?同样,如果你的问题是关于家庭作业的,你应该在问题中指出这一点。否则回答的人就没有正确的上下文。let concat xs xs'=let combList=xs@xs'let concatList=List.collect id combList printfn“%A”concatList concat[1;2;3;4][5;6;7;8]这样应该可以工作吗?如果我只需要获取参数并添加let combList,那么使用id关键字就可以工作了。我永远不会用这种方式收集,所以我被告知这样做似乎很奇怪。感谢您的id建议。id只是
fun i->i