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

如何在F中将(int*int)列表转换为(int:list),list,f#,seq,List,F#,Seq,我有一个成对的序列,比如:Original=[0,0;1,2;3,4] 我想把这个整数*整数的序列转换成整数Final=[0,0,1,2,3,4]的序列 谁能告诉我怎么做 [(0,0); (1,2); (3,4)] |> List.map(fun (x,y)->[x; y]) |> List.concat 将元组序列映射到列表列表,然后将列表连接在一起 或 我首先想到了较长的Seq版本,因为Seq模块传统上有更多的操作符要处理。但是,F 4、Seq、List和Array类型将

我有一个成对的序列,比如:Original=[0,0;1,2;3,4] 我想把这个整数*整数的序列转换成整数Final=[0,0,1,2,3,4]的序列 谁能告诉我怎么做

[(0,0); (1,2); (3,4)] |> List.map(fun (x,y)->[x; y]) |> List.concat
将元组序列映射到列表列表,然后将列表连接在一起

我首先想到了较长的Seq版本,因为Seq模块传统上有更多的操作符要处理。但是,F 4、Seq、List和Array类型将具有完整的操作员覆盖范围。

使用List.collect

在你的问题中,你在开头说你想要一个列表,但在结尾说的是序列,无论如何,对于序列,也可以使用collect


如需了解更多信息,collect是一元函数或运算符>>=在某些语言中,C中的SelectMany对于列表/序列相当于一个后跟concat的映射。

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

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

原始列表是由两个项组成的元组列表。我是否应该在a和b之间加一个括号,换句话说[对于a,b在原文中产生a产生b]?我已经对代码进行了测试,两种方法都给出了相同的结果,哪一种是正确的,原因是什么?>如果它们都有效,并且都产生相同的结果,那么它们都是正确的。只有当缺少paren会导致歧义和编译器错误时,才在F中强制使用paren。
[(0,0); (1,2); (3,4)] |> List.collect (fun (x,y) -> [x; y])
[ for a, b in original do
    yield a
    yield b ]