gpt4 book ai didi

.net - 使用 List.collect f#

转载 作者:行者123 更新时间:2023-12-01 11:23:08 26 4
gpt4 key购买 nike

我正在尝试定义一个函数,它接受两个列表并使用 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”

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

编辑:

所以我有点让它像这样工作:
 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]

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

只希望它是 [1 ;2 ;3 4; 5; 6; 7; 8;]
任何想法为什么它运行了这么多次?

编辑2:

所以我让它像这样工作:
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 -> [for i in 1..3 -> x * i]) .这给了我们与使用 List.map 相同的结果.结果是 [[10; 20; 30]; [20; 40; 60]; [30; 60; 90]] ,然后由 List.collect 连接进入上面的最终结果。

现在关于你的问题,让我们考虑一个相关的问题。假设我们得到了一个列表列表,例如
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 ,但我们仍然需要一个可以做 map 的函数。但是,我们真的不想对 x 的元素进行任何转换。我们只想按原样使用它们,这意味着我们应该使用 id .然后使用
List.collect id x

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

关于.net - 使用 List.collect f#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39998161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com