OCaml はfunction `A -> 1 | _ -> 0
型を与えます[> `A] -> int
が、なぜそうではないのです[> ] -> int
か?
これは私の推論です:
function `B -> 0
タイプがあり[<`B] -> int
ます。`A -> 0
ブランチを追加してそれfunction `A -> 1 | `B -> 0
を緩め[<`A|`B] -> int
ます。関数は、受け入れることができる引数の型において、より寛容になります。意味あり。function _ -> 0
タイプがあり'a -> int
ます。この型は で単一化可能で[> ] -> int
あり[> ]
、すでに開いている型です (非常に寛容です)。`A -> 0
ブランチを追加して作成すると、タイプがにfunction `A -> 1 | _ -> 0
制限さ[>`A] -> int
れます。それは私には意味がありません。実際、さらに別のブランチ`C -> 1
を追加すると[>`A|`C] -> int
、タイプがさらに制限されます。なんで?
注: 回避策を探しているわけではありません。この動作の背後にあるロジックを知りたいだけです。
関連するメモでは、function `A -> `A | x -> x
has type([>`A] as 'a) -> 'a
があり、これもパラメーターの制限的なオープン型ですが、その理由は理解できます。'a -> 'a
型は, [>` ] -> 'b
, で統一する必要があり'c -> [>`A]
ます。それを行う唯一の方法はのようです([>`A] as 'a) -> 'a
。
私の最初の例と同様の理由がありますか?