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

时间:2014-11-15 06:26:38

标签: list f# seq

我有一个成对的序列,如:Original = [(0,0); (1,2); (3,4)] 我想将这个(int * int)的seq转换为int final = [0,0,1,2,3,4]的seq 任何人都可以建议我这样做的方法吗?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

使用List.collect

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

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

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

答案 2 :(得分:2)

[(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类型将具有完整的运营商覆盖范围。