タプルの自明なシーケンスと、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 に正しく変換できないため、コンパイルされません。興味深いことに、 のように 3 番目のパラメーターを省略しlet ad2たり、 のように手動でインライン化したりするfstと、問題なく動作します。sndlet 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でコンパイルされない理由にまだ興味があります。fstsnd