シナリオ 1
let map = Dictionary<string,obj>()
map.Add("1",10)
map.Add("2",10L)
map.Add("3","10")
これはうまく準拠しています
シナリオ 2
let map = Dictionary<string,(unit -> obj)>()
map.Add("1",fun() -> 10)
map.Add("2",fun() -> 10L)
map.Add("3",fun() -> "10")
ここで、コンパイラは obj を除外したが、遭遇したときに int を見つけたと言っています10
シナリオ 3
let map = Dictionary<string,(unit -> 'a)>()
map.Add("1",fun() -> 10)
map.Add("2",fun() -> 10L)
map.Add("3",fun() -> "10")
ここで、コンパイラは最初のエントリを受け入れますが、'a が int に制約され、次の 2 つのエントリは int ではないため失敗します。
1 番目の質問: シナリオ 2 ではコンパイルされないのに、シナリオ 1 ではコンパイルされるのはなぜですか?
2 番目の質問: 'a がシナリオ 3 で制約されるのを防ぐ方法はありますか、または F# のコレクションでさまざまな型 (具体的にはこの例のような関数型) を持つことを可能にする特定のパターンを使用できますか?
値 (obj / 'a) が使用される唯一のことは、println "%A"
それができない理由がわからない引数であることです。