在F#中旋转或压缩seq <seq <'a >>

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>>对象.每个序列(内部和外部)可以包含任意数量的项目.

Ast*_*sti 4

如果你想要一个语义上 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)