我目前正在经历一些中期练习题,但我似乎被困在识别这个函数的类型,通过它走过(甚至不知道从哪里开始)。OCaml - 识别此功能的类型
let compose f g = (fun x -> (f (g x)))
任何帮助/指导在正确的方向将不胜感激,谢谢。
我目前正在经历一些中期练习题,但我似乎被困在识别这个函数的类型,通过它走过(甚至不知道从哪里开始)。OCaml - 识别此功能的类型
let compose f g = (fun x -> (f (g x)))
任何帮助/指导在正确的方向将不胜感激,谢谢。
的compose
函数有两个参数,所以它应该有类型:
'a -> 'b -> 'c
(这'a
,'b
和'c
是类型变量,只是一个占位符,我们会细化他们在推导过程)。
此类型表示:相应地采用'a
和'b
类型的参数并返回'c
类型的值。
让我们往前走,我们看到了一个参数的函数=
的右侧,这意味着'c
必须是一个箭头型也:
'a -> 'b -> ('d -> 'e)
因此,返回值是一个函数它接受名为x
的类型为'd
的值。但是,我们可以看到,g
功能也被应用到这个值,这意味着,我们的原函数的第二个参数,即有键入'b
实际上必须是一个函数,接受'd
类型也值:
'a -> ('d -> 'f) -> ('d -> 'e)
接下来我们看到,类型为'a
的第一个参数f
也适用于任何g
返回的函数。这意味着它必须是一个接受'f
并返回一些值的函数。但由于功能f
的返回值是compose
函数的返回值,这意味着它应该返回'e
,所以
('f -> 'e) -> ('d -> 'f) -> ('d -> 'e)
现在,让我们进行重命名,以使它看起来更好:
('a -> 'b) -> ('c -> 'a) -> ('c -> 'b)
最后,由于->
联营权,我们可以去掉最后两个括号:
('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
因此函数的定义是:
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
第一套括号:( 'A - >' b)中说,f是一个函数, '和返回的东西' B
第二组圆括号:('c - >'a)表示g是一个函数,它接受'c'类型的东西并返回类型'a'。
最后一部分'c - >'b表示我们返回一个函数,它接受'c'类型的东西并返回'b'。
要知道为什么这些类型的分配,我们可以通过查看此开始:
(g x)
所以我们看到,G有适用于它的变量x。所以g必须是一个函数。所以我们可以看看x赋给它一个类型'c。由于x:'c应用于g,g必须以'c'作为参数并返回一些内容。假设它返回'a。我们也知道应用的表达式(g x)
返回类型'a。
接下来让我们来看看: (f (g x)))
由于(g x):'a
被应用到f。所以f也必须是一个函数。由于它被应用了一些'我们现在知道它需要一些类型'a作为参数。然后我们可以说它返回类型'b'。应用的表达式(f (g x)))
返回类型'b。
如果我的解释混淆你只是让我知道,我会尝试澄清。
感谢您抽出宝贵时间回答时,我发现它有助于作为对其他答案的补充,因为我正在寻找一个向前移动的答案而不是向后的答案。 – user2789945 2015-04-06 01:32:56
感谢您花时间回答,我非常感谢,并且它的结构与我所寻找的完全一样。然而,让我失望的句子是:所以,返回值是一个接受名为x的类型'e'的值的函数。你不是故意的吗? – user2789945 2015-04-06 01:30:32