我有一个foo: seq<int*int>
我想拆分元组项目,然后将结果存储到两个变量,每个变量为seq<int>
我想知道是否有更漂亮的方法来做到这一点,例如

let item1, item2 = foo |> ?????

我当前的解决方案:
let item1 = foo |> Seq.map(fun (f1,_) -> f1)
let item2 = foo |> Seq.map(fun (_,f2) -> f2)

最佳答案

遗憾的是,尽管确实存在与Lists(Seq.unzip)和Arrays(List.unzip)等效的语言,但该语言中没有内置的Array.unzip函数。

定义这种功能的方法有几种,一种方法是:

let unzip sequence =
    let (lstA, lstB) =
        Seq.foldBack (fun (a,b) (accA, accB) ->
            a::accA, b::accB) sequence ([],[])
    (Seq.ofList lstA, Seq.ofList lstB)

另外,如果您不希望在列表之间来回切换,则可以执行以下操作:
let item1, item2 =
    let it1, it2 =
        foo
        |> List.ofSeq
        |> List.unzip
    (Seq.ofList it1, Seq.ofList it2)

关于f# - 如何做Seq.unzip,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37034919/

10-13 08:33