f#元组item1的seq

时间:2017-08-21 01:29:34

标签: f# f#-interactive

我不明白为什么我会收到以下错误:

> let x = "ABCDAACCECFG"|>Seq.sort|>Seq.groupBy (fun x->x);;
val x : seq<char * seq<char>>

> x;;
val it : seq<char * seq<char>> =
  seq
    [('A', seq ['A'; 'A'; 'A']); ('B', seq ['B']);
     ('C', seq ['C'; 'C'; 'C'; 'C']); ('D', seq ['D']); ...]

> (x|> Seq.head).GetType();;
val it : System.Type =
  System.Tuple`2[System.Char,System.Collections.Generic.IEnumerable`1[System.Char]]
    {Assembly = mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
     AssemblyQualifiedName = "System.Tuple`2[[System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.IEnumerable`1[[System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
...
     DeclaredProperties = [|Char Item1;
                            System.Collections.Generic.IEnumerable`1[System.Char] Item2;
                            Int32 System.ITuple.Size|];
...;}

> x|> Seq.map (fun x -> x.Item1, x.Item2)|>dict;;

  x|> Seq.map (fun x -> x.Item1, x.Item2)|>dict;;
  ------------------------^^^^^

stdin(123,25): error FS0039: The field, constructor or member 'Item1' is not defined.

在我看来,x是一个元组序列,其中每个元组都有Item1(Char)和Item2(seq Char)属性。我想把它变成字典。

显然,我错过了一些东西。任何人都可以帮助我理解我做错了什么以及如何做对吗?

1 个答案:

答案 0 :(得分:2)

F#似乎没有C#中的底层元组中的Item1和Item2属性。我尝试了以下看似无误的工作。

使用函数fst和snd:

Dataset<Row> ds1 = ds.toDF("key","value");
ds1.groupBy(col("key")).sum("value").show();

使用模式匹配:

x|> Seq.map (fun x -> fst x, snd x) |> dict

显然没有使用Seq.map也可以:

x|> Seq.map (function (key, value) -> (key, value)) |> dict