2015-04-06 74 views
0

我目前正在经历一些中期练习题,但我似乎被困在识别这个函数的类型,通过它走过(甚至不知道从哪里开始)。OCaml - 识别此功能的类型

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

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

回答

2

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 
+0

感谢您花时间回答,我非常感谢,并且它的结构与我所寻找的完全一样。然而,让我失望的句子是:所以,返回值是一个接受名为x的类型'e'的值的函数。你不是故意的吗? – user2789945 2015-04-06 01:30:32

1

因此函数的定义是:

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。

如果我的解释混淆你只是让我知道,我会尝试澄清。

+0

感谢您抽出宝贵时间回答时,我发现它有助于作为对其他答案的补充,因为我正在寻找一个向前移动的答案而不是向后的答案。 – user2789945 2015-04-06 01:32:56