首先,我们写_B f g x = f (g x) = (f . g) x
。
由于f $ x = f x
,我们有(.)$(.) = _B $ _B = _B _B
。其类型被机械地衍生,如
0. (.) :: ( b -> c ) -> ((a -> b) -> (a -> c))
1. (.) :: (b1 -> c1) -> ((a1 -> b1) -> (a1 -> c1))
2. (.) (.) :: {b ~ b1 -> c1, c ~ (a1 -> b1) -> (a1 -> c1)} (a -> b) -> (a -> c)
:: (a -> b1 -> c1) -> a -> (a1 -> b1) -> (a1 -> c1)
:: (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
a
和a1
是两个不同类型的变量,就像b
和b1
。但由于最终类型中没有b
或c
,我们可以将b1
和c1
重新命名为b
和c
,以简化。但不是a1
。
实际上我们可以读到这个类型:它获得了一个二元函数f :: a -> b -> c
; x :: a
参数值,g :: a1 -> b
一元函数,和另一个值y :: a1
,并结合他们唯一可能的方式,这样的类型适合:
f x :: b -> c
g y :: b
f x (g y) :: c
其余部分已经回答。通常在组合方程式中可以很容易地使用简化方法,例如_B _B f x g y = _B (f x) g y = f x (g y)
,只需要两个应用_B
的定义(我们可以随时添加尽可能多的参数)。
请注意'((。)$(。))'中的'$'是不必要的;表达式'((。)(。))'是完全等价的。 –