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) 是什么意思? 'af 相关,'bx 相关吗?

另外一个让我更加迷惑的函数构成是:

# 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 是两个参数的函数:

  1. 第一个是('a -> 'b)类型的,所以函数如上
  2. 第二个是'a
  3. 类型

因此,此函数 return 与第一个参数 return 类型 'b 的类型相同。实际上,它接受一个函数及其参数并将该函数应用于该参数。


在第二种情况下,您可以从内部调用向后工作。让我们来看看f(f(x))

  1. x 是任何类型的东西 'b。我们还不知道这是什么类型。
  2. 因为我们有 f(x)f 必须是 'b -> 'c 类型的函数。它是 'b 因为我们知道它需要 x 作为输入,而 x 的类型是 'b.
  3. 因此,composition2的类型是('b -> 'c) -> 'b
  4. 因为我们有 f(f(x))f 的参数类型必须与其 return 值的类型相同。所以,'b == 'c。调用该类型 'a.
  5. 因为x的类型是'b,和'a一样,所以x的类型一定是'a.
  6. 由于 f'b -> 'c 类型,其中 'b == 'a'c == 'af 必须是 'a -> 'a 类型。
  7. 因此,composition2的类型是('a -> 'a) -> 'a