OCaml 类型推断,一个具体的例子

OCaml Type Inference, a concrete example

我正在阅读包含以下示例的 Ocaml 笔记:

let o f g x = (f (g (x)));;
val o : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

注释中没有关于类型推断的解释。在我的理解中,('a -> 'b)对应g(x)('c -> 'a)对应f()。我对么?另外,'b对应的是整个函数的输出。 'c 对应什么?如果对这种类型推断有完整的解释,我们将不胜感激。

少了几个括号:

let o f g x = f (g x);;
val o : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

函数 g 接受类型 'a 和 returns 'b 的值。因此我们可以推断 f 取值类型 'b 和 returns 'c.

但是,由于参数 运行 的方式,我们会说 f'a -> 'b 类型,而 g'c -> 'a 类型因为输入类型未知但它必须输入 g 需要 'a.

参数 x 被发送到 g,它需要 'c 类型的值,因此 x 被推断为 'c 类型。因为 f 有一个 return 类型的 'b,所以整个东西的 return 类型是 'b.

将所有这些放在一起,o 的类型为 ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b

也许视觉效果会有所帮助:

       +-----+     +-----+
(x)    |     |     |     |
'c -> 'c  g 'a -> 'a  f 'b -> 'b
       |     |     |     |
       +-----+     +-----+

将它们重新排列为它们在 o 的定义中出现的顺序:

  +-----+     +-----+
  |     |     |     |    (x)
 'a  f 'b    'c  g 'a    'c
  |     |     |     |
  +-----+     +-----+

In my understanding, ('a -> 'b) corresponds to g(x) and ('c -> 'a) corresponds to f().

你在这里落后了——('a -> 'b) 是 o 的第一个(curried)参数的类型——在这种情况下是 f。 (c' -> a') 是 g 的类型,即第二个柯里化参数。

'b corresponds to the output of the entire function. What does 'c corresponds to?

'c是x的类型,第三个参数。

所以 o 接受三个参数(两个函数和一个值),将第三个参数传递给第二个(函数)参数,将它的 return 值传递给(第一个)函数参数,returns 结果。完全如第一行所述。