Gre*_*Ros 5 f# pivot functional-programming sequence
假设我有一系列序列,例如
{1, 2, 3}, {1, 2, 3}, {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
什么是旋转或拉链这个序列的最佳方法,所以我反而拥有,
{1, 1, 1}, {2, 2, 2}, {3, 3, 3}
Run Code Online (Sandbox Code Playgroud)
有没有一种可理解的方式这样做而不诉诸操纵底层IEnumerator<_>类型?
澄清一下,这些是seq<seq<int>>对象.每个序列(内部和外部)可以包含任意数量的项目.
如果你想要一个语义上 Seq 的解决方案,你将不得不一直保持懒惰。
let zip seq = seq
|> Seq.collect(fun s -> s |> Seq.mapi(fun i e -> (i, e))) //wrap with index
|> Seq.groupBy(fst) //group by index
|> Seq.map(fun (i, s) -> s |> Seq.map snd) //unwrap
Run Code Online (Sandbox Code Playgroud)
测试:
let seq = Enumerable.Repeat((seq [1; 2; 3]), 3) //don't want to while(true) yield. bleh.
printfn "%A" (zip seq)
Run Code Online (Sandbox Code Playgroud)
输出:
seq [seq [1; 1; 1]; seq [2; 2; 2]; seq [3; 3; 3]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |