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