为什么这个OCaml表达式具有以下类型?

时间:2014-11-10 20:34:39

标签: types ocaml

表达式为f x y = 1 + (x 1) + (y 1),其类型为(int->int)->(int->int)->int。我不明白它是怎么样的。为什么不是int->int

4 个答案:

答案 0 :(得分:3)

因为你有函数应用程序(x 1)和(y 1)。 x和y被视为采用int参数并返回int的函数。

所以x是type(int - > int),y是type(int - > int)。 在x和y上都应用了1。因此,如果将1应用于类型为(int - > int)的内容,则会得到类型为int的内容。所以你的整个函数返回1 + int + int,这基本上是int。

答案 1 :(得分:3)

当OCaml推断表达的类型

let f x y = 1 + (x 1) + (y 1)

它会想到这样的事情:

  1. 由于(+)的类型为int -> int,因此表达式(x 1)的类型应为int,因为它出现在+的右侧。

  2. 由于x 1应评估为int并且它是一个应用程序,因此它应该具有类型_ -> int。由于1int字面值,因此其类型为int -> int

  3. 使用我们可以推断的相同逻辑,y也有类型int -> int

答案 2 :(得分:2)

表达式(x 1)要求x是类型int -> 'a的函数。同样适用于(y 1)。其余部分来自于此。

答案 3 :(得分:2)

let f x y = 1 + (x 1) + (y 1)
  1. 您有(x 1),因此x必须是函数

  2. 你有1 + (x 1),所以(x 1)必须返回一个int,同时1是int,所以x: int -> int <fun>

  3. 使用与上述相同的归纳,y: int -> int <fun>

  4. 你有f x y,所以f是一个函数,我们已经知道x和y是什么类型,并且知道=的右侧必须是int,所以{{1 }}