F#如何将元组列表转换为并行数组

时间:2015-08-04 13:47:14

标签: .net f# functional-programming

我是函数式编程和F#

的新手

我试图将元组列表转换为并行列表,例如

let results = [("foo",3);("bar", 4)};("bazz", 8)]
// do something to convert it
// output = ["foo";"bar";"bazz"], output2 = [3;4;8]

我试图做的是

let issue = []
let count = []

for tpl in results do
    fst tpl |> issue
    snd tpl |> count

但显然这不会编译。

我从声明中获取元组列表

let results = IssueData |> Seq.countBy id |> Seq.toList 

我将如何做到这一点?

1 个答案:

答案 0 :(得分:3)

第一部分:有List.unzip

> let results = [("foo",3);("bar", 4);("bazz", 8)];;

val results : (string * int) list = [("foo", 3); ("bar", 4); ("bazz", 8)]

> let (issue, count) = List.unzip results;;

val issue : string list = ["foo"; "bar"; "bazz"]
val count : int list = [3; 4; 8]

如果我说得对,这就是你想要知道的所以你可以写

let (issues, count)= IssueData |> Seq.countBy id |> Seq.toList |> List.unzip

备注

  • 如果你想知道 - 你仍然需要F#4中的Seq.toList,因为仍然没有Seq.unzip;)(它是少数没有被标准化的东西之一所有List / Array / Seq)
  • 如果您不熟悉FP / F#,那么自己重新实现List.unzip是一项很好的练习(提示:一如既往有两种情况:[](a,b):rest