首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在F#中旋转或压缩序列

在F#中旋转或压缩序列
EN

Stack Overflow用户
提问于 2012-10-07 14:12:18
回答 4查看 982关注 0票数 5

假设我有一系列的序列,例如

代码语言:javascript
运行
复制
{1, 2, 3}, {1, 2, 3}, {1, 2, 3}

什么是最好的方法来旋转或压缩这个序列,所以我有,

代码语言:javascript
运行
复制
{1, 1, 1}, {2, 2, 2}, {3, 3, 3}

有没有一种可以理解的方式,不用操作底层的IEnumerator<_>类型?

为了清楚起见,这些是seq<seq<int>>对象。每个序列(内部和外部)可以有任意数量的项。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-07 18:33:36

如果你要寻找一个语义上是Seq的解决方案,你将不得不一直保持懒惰。

代码语言:javascript
运行
复制
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

测试:

代码语言:javascript
运行
复制
let seq =  Enumerable.Repeat((seq [1; 2; 3]), 3) //don't want to while(true) yield. bleh.
printfn "%A" (zip seq)

输出:

代码语言:javascript
运行
复制
seq [seq [1; 1; 1]; seq [2; 2; 2]; seq [3; 3; 3]]
票数 4
EN

Stack Overflow用户

发布于 2012-10-07 14:40:34

这看起来很不雅观,但它得到了正确的答案:

代码语言:javascript
运行
复制
(seq [(1, 2, 3); (1, 2, 3); (1, 2, 3);]) 
|> Seq.fold (fun (sa,sb,sc) (a,b,c) ->a::sa,b::sb,c::sc) ([],[],[]) 
|> fun (a,b,c) -> a::b::c::[]
票数 1
EN

Stack Overflow用户

发布于 2012-10-07 15:21:24

看起来像是矩阵转置。

代码语言:javascript
运行
复制
let data =
    seq [
        seq [1; 2; 3]
        seq [1; 2; 3]
        seq [1; 2; 3]
    ]

let rec transpose = function
    | (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
    | _ -> []

// I don't claim it is very elegant, but no doubt it is readable
let result =
    data
    |> List.ofSeq
    |> List.map List.ofSeq
    |> transpose
    |> Seq.ofList
    |> Seq.map Seq.ofList

或者,您可以对seq采用相同的方法,这要归功于this answer提供的优雅的活动模式:

代码语言:javascript
运行
复制
let (|SeqEmpty|SeqCons|) (xs: 'a seq) =
  if Seq.isEmpty xs then SeqEmpty
  else SeqCons(Seq.head xs, Seq.skip 1 xs)

let rec transposeSeq = function
    | SeqCons(SeqCons(_,_),_) as M ->
        Seq.append
            (Seq.singleton (Seq.map Seq.head M))
            (transposeSeq (Seq.map (Seq.skip 1) M))
    | _ -> Seq.empty

let resultSeq = data |> transposeSeq

另请参阅this answer以获取技术细节和两个参考:PowerPackMicrosoft.FSharp.Math.Matrix和涉及可变数据的另一种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12766552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档