我不清楚为什么函数被定义为
f g x = g . g x
有类型
f :: (b -> a -> b) -> b -> a -> a -> b
我原以为它会是类型的
f :: (t -> t) -> t -> t
任何人都可以向我解释表达方式是如何分解的?谢谢!
请注意,功能应用程序具有最高优先级; 经营者以后来.
因此,该术语g . g x
首先应用g
到x
,然后组成的结果,g
本身.如果x
有类型b
,g
必须有类型b -> c
.由于我们撰写g
同g x
(型的后者c
),c
必须是一个函数式返回b
,所以c = a -> b
.现在,g
is b -> a -> b
的类型和类型g . g x
是a -> (a -> b)
; f
碰巧的类型(b -> a -> b) -> b -> a -> a -> b
.
如果你想要这样的东西(a -> a) -> a -> a
,你可以试试其中之一
f g x = g (g x) f g x = (g . g) x f g x = g . g $ x f g = g . g