type large1 = Int of int | Bool of bool
type small1 = Int of int
let intersect1 = Int 0
ocaml 顶级(4.01.0)推断intersect1
as的类型small1
。我以为我明白了原因:small1
看起来像是large1
.
但现在:
type small2 = Int of int
type large2 = Int of int | Bool of bool
let intersect2 = Int 0
顶层现在推断出一种large2
for intersect2
。这使它看起来像接近被用作决胜局,但这非常令人惊讶,并且与我使用的其他语言不同,所以我怀疑这里有一些微妙的东西我误解了。
一个并发症:正如激发这个问题的答案的问题所指出的那样,“更接近”的类型并没有完全隐藏更远的类型。
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
zell
被赋予类型left -> right
。
推断这些类型的具体规则是什么?在手册(或任何其他已发表的论文或文档)中我可以在哪里阅读更多信息?