OCaml - 识别此功能的类型

时间:2015-04-06 00:08:54

标签: types ocaml

我目前正在经历一些中期的练习问题,但我似乎一直坚持通过它来识别这个功能的类型(甚至不确定从哪里开始)。

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

非常感谢任何正确方向的帮助/指导,谢谢。

2 个答案:

答案 0 :(得分:2)

compose函数有两个参数,因此它应该有类型:

'a -> 'b -> 'c

(此'a'b'c是类型变量,只是占位符,我们将在派生过程中对它们进行优化)。

此类型表示:相应地接受'a'b类型的参数,并返回'c类型的值。

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

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

因此,返回值是一个接受名为'd的{​​{1}}类型值的函数。但我们可以看到,x函数也应用于此值,这意味着,我们原始函数的第二个参数,类型g实际上必须是一个函数,它接受一个值同时输入'b

'd

接下来我们看到,第一个参数'a -> ('d -> 'f) -> ('d -> 'e) ,类型f也是一个应用于任何'a返回的函数。这意味着,它必须是一个接受g并返回一些值的函数。但由于函数'f的返回值是f函数的返回值,这意味着它应该返回compose,所以

'e

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

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

最后,由于('a -> 'b) -> ('c -> 'a) -> ('c -> 'b) 与右侧相关联,我们可以删除最后两个括号:

->

答案 1 :(得分:1)

所以函数定义是:

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

第一组括号:(&#39; a - &gt;&#39; b)表示f是一个函数,它接受&#39; a并返回&#39; b

的内容

第二组括号:(&#39; c - &gt;&#39; a)表示g是一个带有类型&c; c并返回类型&#39; a的函数的函数

最后一部分&#c;&gt; &#39; b表示我们返回一个函数,该函数采用类型&c; c并返回&#39; b。

要了解分配这些类型的原因,我们可以从这看:

(g x)

所以我们看到g已经应用了变量x。所以g必须是一个函数。所以我们可以看一下x为它指定一个类型&c; c。由于x:&#39; c应用于g,g必须将&#c; c作为参数并返回一些内容。让我们说它会返回一些&a; a。我们还知道应用的表达式(g x)会返回类型为&#39; a。

的内容

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

(g x):'a应用于f。所以f也必须是一个函数。由于它应用了一些东西,我们现在知道它需要某种类型的&a; a作为参数。然后我们可以说它会返回类型&b; b。应用的表达式(f (g x)))会返回类型为&#39; b。

的内容

如果我的解释让你感到困惑,那就让我知道,我会尝试克制。