f# 元组 item1 的序列
f# Seq of tuple item1
我不明白为什么会出现以下错误:
> 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) 属性。我想把它变成一本字典。
显然,我遗漏了什么。任何人都可以帮助我了解我做错了什么以及如何改正吗?
F# 似乎没有像 C# 中那样从底层元组中显示 Item1 和 Item2 属性。我尝试了以下似乎没有错误的工作。
使用函数 fst 和 snd:
x|> Seq.map (fun x -> fst x, snd x) |> dict
使用模式匹配:
x|> Seq.map (function (key, value) -> (key, value)) |> dict
而且显然不使用 Seq.map 也能正常工作:
x |> dict
我不明白为什么会出现以下错误:
> 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) 属性。我想把它变成一本字典。
显然,我遗漏了什么。任何人都可以帮助我了解我做错了什么以及如何改正吗?
F# 似乎没有像 C# 中那样从底层元组中显示 Item1 和 Item2 属性。我尝试了以下似乎没有错误的工作。
使用函数 fst 和 snd:
x|> Seq.map (fun x -> fst x, snd x) |> dict
使用模式匹配:
x|> Seq.map (function (key, value) -> (key, value)) |> dict
而且显然不使用 Seq.map 也能正常工作:
x |> dict