Ocaml通过与值的接近程度消除推断类型的歧义?

Ocaml通过与值的接近程度消除推断类型的歧义?,ocaml,type-inference,algebraic-data-types,subtyping,refinement-type,Ocaml,Type Inference,Algebraic Data Types,Subtyping,Refinement Type,ocaml顶层(4.01.0)将intersect1的类型推断为small1。我想我明白了为什么:small1看起来像large1的子类型(或细化类型) 但现在: type large1 = Int of int | Bool of bool type small1 = Int of int let intersect1 = Int 0 顶层现在为intersect2推断出一种类型的large2。这使它看起来像是用接近来打破僵局,但这非常令人惊讶,而且与我使用过的其他语言不同,所以我怀

ocaml顶层(4.01.0)将
intersect1
的类型推断为
small1
。我想我明白了为什么:
small1
看起来像
large1
的子类型(或细化类型)

但现在:

type large1 = Int of int | Bool of bool
type small1 = Int of int    
let intersect1 = Int 0
顶层现在为
intersect2
推断出一种类型的
large2
。这使它看起来像是用接近来打破僵局,但这非常令人惊讶,而且与我使用过的其他语言不同,所以我怀疑这里有一些微妙的东西我误解了

一个复杂问题:如中所述,“closer”类型并没有完全隐藏进一步的类型

type small2 = Int of int
type large2 = Int of int | Bool of bool    
let intersect2 = Int 0
zell
的类型为
left->right

推断这些类型的具体规则是什么,我可以在(或任何其他已发表的论文或文档)的什么地方阅读更多内容?

如今,OCaml对记录字段和构造函数进行了“类型导向”的消歧

从2012年9月12日发布的OCaml 4.01.0开始,它就被添加到语言中。有关更多信息,发行说明请参阅此链接:

下面是一篇很好的文章,描述了做出改变的思维过程:

以下是更详细的后续内容:


我找不到OCaml手册中提到的这个功能(如您所说)。

我添加了一个关于隐藏的注释。我希望问题现在更清楚了。在
zell
中,名称
Int
根据上下文指两种不同的类型。规则是否类似于“使用最近的名称,然后使用下一个最近的名称,依此类推,直到推断成功”?如果是这样,我在哪里可以在手册或学术论文中读到更多关于这方面的内容?你说得对,我现在明白你的意思了。现在OCaml中有“类型导向”的歧义消除。我会尽可能地修正我的答案。。。
type left = Int of int | Dem
type right = Int of int | Gop

let zell (x:left) =
  match x with
    Int v -> Int v
  | Dem -> Gop