OCaml - 识别此函数的类型

OCaml - Identifying the type of this function

我目前正在做一些期中练习题,但我似乎一直坚持通过遍历来识别这个函数的类型(甚至不知道从哪里开始)。

let compose f g = (fun x -> (f (g x)))

任何正确方向的帮助/指导将不胜感激,谢谢。

所以函数定义为:

val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

第一组括号:('a -> 'b) 表示 f 是一个函数,它接受 'a 和 returns 某些 'b

第二组括号:('c -> 'a) 表示 g 是一个接受类型 'c 和 returns 类型 'a 的函数。

最后一部分 'c -> 'b 说我们 return 一个接受类型 'c 和 returns 类型 'b 的函数。

要了解为什么要分配这些类型,我们可以从这里开始:

(g x)

所以我们看到 g 应用了变量 x。所以 g 必须是一个函数。所以我们可以看看 x 给它分配一个类型 'c。由于 x:'c 应用于 g,g 必须将 'c 作为参数和 return 某些东西。让我们说它 return 是 'a.我们还知道应用表达式 (g x) return 是 'a.

类型的东西

接下来我们来看: (f (g x)))

因为 (g x):'a 应用于 f。所以 f 也必须是一个函数。因为它应用了 'a 的东西,我们现在知道它需要 'a 类型的东西作为参数。然后我们可以说它 return 是 'b 类型的东西。应用的表达式 (f (g x))) returns s something of type 'b.

如果我的解释让您感到困惑,请告诉我,我会尽力澄清。

compose 函数有两个参数,所以它的类型应该是:

'a -> 'b -> 'c

(这个'a'b'c是类型变量,只是一个占位符,我们会在推导过程中细化)。

这个类型的意思是:对应地接受'a'b类型的参数,return一个'c.

类型的值

让我们继续前进,在=的右边我们看到一个单参数的函数,这意味着'c也必须是一个箭头类型:

'a -> 'b -> ('d -> 'e)

因此,return 值是一个接受名为 x'd 类型值的函数。但是我们可以看到,g 函数也应用于这个值,这意味着我们原始函数的第二个参数,类型为 'b 实际上必须是一个函数,它接受一个值键入 'd 还:

'a -> ('d -> 'f) -> ('d -> 'e)

接下来我们看到,类型为 'a 的第一个参数 f 也是一个应用于任何 g return 的函数。这意味着,它必须是一个接受 'f 和 return 某些值的函数。但是由于函数f的return值是compose函数的return值,也就是说它应该return'e,所以

('f -> 'e) -> ('d -> 'f) -> ('d -> 'e)

现在,让我们重命名一下,让它看起来更好看:

('a -> 'b) -> ('c -> 'a) -> ('c -> 'b)

最后,由于 -> 关联到右边,我们可以删除最后两个括号:

('a -> 'b) -> ('c -> 'a) -> 'c -> 'b