我目前正在经历一些中期的练习问题,但我似乎一直坚持通过它来识别这个功能的类型(甚至不确定从哪里开始)。
let compose f g = (fun x -> (f (g x)))
非常感谢任何正确方向的帮助/指导,谢谢。
答案 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。
如果我的解释让你感到困惑,那就让我知道,我会尝试克制。