ここで問題ありません:これはF#コンパイラの型推論を混乱させるのはなぜですか?
module Seq =
let private rnd = Random Environment.TickCount
let random =
fun (items : 'T seq) ->
let count = Seq.length items
items |> Seq.nth (rnd.Next count)
Seq.random
の署名がitems:seq<'T> -> 'T
です。すべての良い。
はい、私はちょうどlet random items = [...]
、それはポイントではないことができることを知っています。
ポイントはitems
が突然、私はこれを行う際にタイプseq<obj>
に制限されていることである。
module Seq =
let random =
let rnd = Random Environment.TickCount
fun (items : 'T seq) ->
let count = Seq.length items
items |> Seq.nth (rnd.Next count)
...つまり、私はクロージャとしてRandom
オブジェクトを追加します。 random
にカーソルを合わせると、Intellisenseはその署名がitems:seq<obj> -> obj
になったことを示しています。
興味深いことに、F#Interactiveでコードを選択して[Alt]+[Enter]
を実行すると、署名はseq<'a> -> 'a
と表示されます。 WTH ??
ここでは何が起こっているのですか?型推論の混乱と不一致はなぜですか?
kthx [フィラーチャンク] – MiloDC
非常に興味深いです。私はジェネリックletバインディングが無パラメータ関数になっていることに気づいていませんでした。同じことが '未チェック(Unchecked) 'にも当てはまりますか?defaultOf <_> 'と同様のコアライブラリ関数(1つのように見えません)? – Abel
はい。 'Seq.empty'は別の例です。 –