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 -> xhas type([>`A] as 'a) -> 'aがあり、これもパラメーターの制限的なオープン型ですが、その理由は理解できます。'a -> 'a型は, [>` ] -> 'b, で統一する必要があり'c -> [>`A]ます。それを行う唯一の方法はのようです([>`A] as 'a) -> 'a。
私の最初の例と同様の理由がありますか?