我有一个成对序列,如下所示:原始 = [(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 类型将具有完整的运算符覆盖范围。