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。
我的第一个例子是否存在类似的原因?