【发布时间】:2014-11-15 06:26:37
【问题描述】:
我有一个成对的序列:Original = [(0,0); (1,2); (3,4)] 我想将此序列 (int *int) 转换为 int Final= [0,0,1,2,3,4] 的序列 任何人都可以建议我这样做的方法吗?
【问题讨论】:
我有一个成对的序列:Original = [(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 是单子函数bind 或运算符>>= 在某些语言(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 类型将具有完整的运算符覆盖范围。
【讨论】: