问题描述
我正在阅读包含以下示例的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
类型,因为输入类型未知,但它必须馈送到'a
的g
。
参数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
| | | |
+-----+ +-----+