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
有 type ([>`A] as 'a) -> 'a
,虽然这也是参数的限制性开放类型,但我可以理解原因。'a -> 'a
类型应与, [>` ] -> 'b
, 'c -> [>`A]
;统一 这样做的唯一方法似乎是([>`A] as 'a) -> 'a
。
我的第一个例子是否存在类似的原因?