Ocaml 的类型推断

Type Inference of Ocaml

我是 Ocaml 的新手。这是我 class 中的一个问题:

让 f a b c d e = e.( if e.(1) then a b else b d )

我们被要求推断“a”的类型。我认为它是一个 int,因为这个 if 操作应该 return 一个 int 来作为 e 数组的索引。但我的回答是错误的。谁能帮我分析一下?非常感谢!

if 的值为 a bb d。由于表达式 a b 必须 return 一个 int(如你所说),a 必须是一个接受一个参数的 函数 并且 return 是一个整数。所以 a 不是一个整数而是一个函数。

a的参数类型也是a类型的一部分。要确定此类型,请注意 b 也是一个 return 是 int 的函数(正如您可以从子表达式 b d 中看出的那样)。所以 a 是一个函数,它接受一个函数参数和 returns int。由于代码中没有任何内容来限制 d 的类型,b 可以是接受一个参数且 return 是一个 int 的任何函数。我们称 b 的参数类型为 't。请注意,对于 f 的不同调用,此类型可能不同。那么a的类型是('t -> int) -> int,其中b对应的类型是't -> intd的类型是't

这一切都非常复杂。可能你的转录有错别字。或者,也许最好找出一个复杂的例子:-)

以上语句等价于:

fun f(a,b,c,d) = e[如果 e[1] 那么 a(b) 否则 b(d) ]

__

注:

  1. "if e[1] then a(b) else b(d)" :这应该是一个整数,因为它充当 e 数组的索引。函数将 return 相同的类型,因此 a(b) 和 b(d) 的类型相等并且应该 return 整数。

  2. e[1] = 这应该是布尔值,这意味着 e 是一个布尔数组。

因此我们得出结论

e : 布尔数组

a : 函数 returns 一个整数

b : 函数 returns 一个整数。

我们无法进一步对 c 和 d 进行类型推断。