如何在 F# 中将 (int* int) 列表转换为 (int: list)



我有一个成对序列,如下所示:原始 = [(0,0);(1,2);(3,4)]我想将 (int *int) 的这个序列转换为 int Final= [0,0,1,2,3,4] 的序列谁能建议我这样做的方法?

另一种选择是使用序列表达式 - 我非常喜欢这个选项,但这是个人喜好的问题:

[ for a, b in original do
    yield a
    yield b ]

使用 List.collect

[(0,0); (1,2); (3,4)] |> List.collect (fun (x,y) -> [x; y])

在你的问题中,你说你想要一个列表在开头,但在最后你说序列,无论如何序列收集也是可用的。

有关更多信息,collect是 monadic 函数绑定或某些语言中的运算符>>=(C# 中的 SelectMany),对于列表/序列,它等效于映射后跟一个 concat。

[(0,0); (1,2); (3,4)] |> List.map(fun (x,y)->[x; y]) |> List.concat

即将元组序列映射到列表列表,然后将列表连接在一起

[(0,0); (1,2); (3,4)] |> Seq.map(fun (x,y)->seq { yield x; yield y}) |> Seq.concat |> Seq.toList

我首先提出了更长的 Seq 版本,因为 Seq 模块传统上有更多的运算符可以使用。 但是,F# 4、Seq、List 和 Array 类型将具有完整的运算符覆盖范围。

最新更新