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 结果。完全如第一行所述。
我正在阅读包含以下示例的 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 结果。完全如第一行所述。