给定一个简单的元组序列,以及一个使用 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
,但我仍然对它为什么不能用fst
andsnd
函数编译感兴趣。