OCaml 输入类型
OCaml Input types
我正在学习 OCaml,但到目前为止我无法理解类型的概念。
例如,如果我们有以下代码:
# let func x = x;;
val func : 'a -> 'a = <fun>
官网告诉我,箭头前的'a
是未知的输入类型,箭头后的'a
是输出。
但是,当我尝试使用函数组合时:
# let composition f x = f(x);;
val composition : ('a -> 'b) -> 'a -> 'b = <fun>
('a -> 'b)
是什么意思?
'a
与 f
相关,'b
与 x
相关吗?
另外一个让我更加迷惑的函数构成是:
# let composition2 f x = f(f(x));;
val composition2 : ('a -> 'a) -> 'a -> 'a = <fun>
我真的不明白为什么我们在这种情况下没有 'b
。
提前致谢!
'a -> 'b
是一种函数类型,它接受一个 'a
类型的参数和 returns 一个 'b
.
类型的值
val composition : ('a -> 'b) -> 'a -> 'b
表示 composition
是两个参数的函数:
- 第一个是
('a -> 'b)
类型的,所以函数如上
- 第二个是
'a
类型
因此,此函数 return 与第一个参数 return 类型 'b
的类型相同。实际上,它接受一个函数及其参数并将该函数应用于该参数。
在第二种情况下,您可以从内部调用向后工作。让我们来看看f(f(x))
x
是任何类型的东西 'b
。我们还不知道这是什么类型。
- 因为我们有
f(x)
,f
必须是 'b -> 'c
类型的函数。它是 'b
因为我们知道它需要 x
作为输入,而 x
的类型是 'b
.
- 因此,
composition2
的类型是('b -> 'c) -> 'b
- 因为我们有
f(f(x))
,f
的参数类型必须与其 return 值的类型相同。所以,'b == 'c
。调用该类型 'a
.
- 因为
x
的类型是'b
,和'a
一样,所以x
的类型一定是'a
.
- 由于
f
是 'b -> 'c
类型,其中 'b == 'a
和 'c == 'a
,f
必须是 'a -> 'a
类型。
- 因此,
composition2
的类型是('a -> 'a) -> 'a
我正在学习 OCaml,但到目前为止我无法理解类型的概念。
例如,如果我们有以下代码:
# let func x = x;;
val func : 'a -> 'a = <fun>
官网告诉我,箭头前的'a
是未知的输入类型,箭头后的'a
是输出。
但是,当我尝试使用函数组合时:
# let composition f x = f(x);;
val composition : ('a -> 'b) -> 'a -> 'b = <fun>
('a -> 'b)
是什么意思?
'a
与 f
相关,'b
与 x
相关吗?
另外一个让我更加迷惑的函数构成是:
# let composition2 f x = f(f(x));;
val composition2 : ('a -> 'a) -> 'a -> 'a = <fun>
我真的不明白为什么我们在这种情况下没有 'b
。
提前致谢!
'a -> 'b
是一种函数类型,它接受一个 'a
类型的参数和 returns 一个 'b
.
val composition : ('a -> 'b) -> 'a -> 'b
表示 composition
是两个参数的函数:
- 第一个是
('a -> 'b)
类型的,所以函数如上 - 第二个是
'a
类型
因此,此函数 return 与第一个参数 return 类型 'b
的类型相同。实际上,它接受一个函数及其参数并将该函数应用于该参数。
在第二种情况下,您可以从内部调用向后工作。让我们来看看f(f(x))
x
是任何类型的东西'b
。我们还不知道这是什么类型。- 因为我们有
f(x)
,f
必须是'b -> 'c
类型的函数。它是'b
因为我们知道它需要x
作为输入,而x
的类型是'b
. - 因此,
composition2
的类型是('b -> 'c) -> 'b
- 因为我们有
f(f(x))
,f
的参数类型必须与其 return 值的类型相同。所以,'b == 'c
。调用该类型'a
. - 因为
x
的类型是'b
,和'a
一样,所以x
的类型一定是'a
. - 由于
f
是'b -> 'c
类型,其中'b == 'a
和'c == 'a
,f
必须是'a -> 'a
类型。 - 因此,
composition2
的类型是('a -> 'a) -> 'a