タプルの自明なシーケンスと、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
と、問題なく動作します。snd
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
snd