给定一个简单的元组序列,以及一个使用 F# PowerPack 的 PSeq 的并行序列:
let a = Seq.singleton (1,"a")  --> val a: seq<int * string>
let b = a |> PSeq.map id       --> val b: pseq<int * string>
现在我想从他们创建一个 .Net BCL 字典:
let bd = b.ToDictionary(fst, snd, HashIdentity.Structural)
let ad = a.ToDictionary(fst, snd, HashIdentity.Structural)
let ad2 = a.ToDictionary(fst, snd)
let ad3 = a.ToDictionary((fun (x,y) -> x), (fun (x,y) -> y), HashIdentity.Structural)
虽然let bd有效,let ad但无法编译,因为它无法推断类型并正确转换为 BCL 的 Func。有趣的是,如果我省略第三个参数(如 in let ad2,或者如果我写出fst并snd手动内联in ),它工作得很好let ad3。
这个表达式应该有类型 Func<(int * string),'a> 但这里有类型 'b * 'c -> 'b
- 为什么不let ad编译,而所有替代方案都可以正常工作?
- 有没有办法在let ad不提供内联函数或类型注释的情况下进行编译?
PS:我需要 HashIdentity.Structural 因为在实际代码中,键不是整数,而是元组或记录
更新:我现在已经定义let dictionary (s : ('a * 'b) seq) = s.ToDictionary((fun (x,y)->x), (fun (x,y)->y), HashIdentity.Structural)了,所以我可以写let ad = a |> dictionary,但我仍然对它为什么不能用fstandsnd函数编译感兴趣。