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

人气:46 发布:2023-01-03 标签: type-inference ocaml

问题描述

我正在阅读包含以下示例的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类型的值并返回'b。因此,我们可以推断f接受'b类型的值并返回'c

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

参数x被发送到g,它需要一个'c类型的值,因此x被推断为'c类型。由于f的返回类型为'b,因此整个事件的返回类型为'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
  |     |     |     |
  +-----+     +-----+

15