2
type large1 = Int of int | Bool of bool
type small1 = Int of int    
let intersect1 = Int 0

ocaml 顶级(4.01.0)推断intersect1as的类型small1。我以为我明白了原因:small1看起来像是large1.

但现在:

type small2 = Int of int
type large2 = Int of int | Bool of bool    
let intersect2 = Int 0

顶层现在推断出一种large2for 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

推断这些类型的具体规则是什么?在手册(或任何其他已发表的论文或文档)中我可以在哪里阅读更多信息?

这个问题的灵感来自于一个关于多态变体的问题的旧答案。

4

1 回答 1

2

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

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

基于类型的记录标签和构造器的选择。

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

解析字段名称

以下是更多详细信息的后续行动:

解析字段名称 2

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

于 2017-03-13T05:26:18.703 回答