派生类型(foldr(。))

时间:2014-05-01 22:36:51

标签: haskell types ghci unification

我正在尝试手动派生(foldr(。))

的类型
foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(.) ::(b2 -> c2) -> (a2 -> b2) -> a2 -> c2

然后:

a1 ~ (b2 -> c2)
b1 ~ (a2 -> b2)
b1 ~ a2

所以我得到了(foldr (.)) :: (a2 -> b2) -> [(b2 -> c2)] -> (a2 -> b2)

但GHCi返回::t (foldr (.)) :: (a -> b) -> [b -> b] -> a -> b

为什么b2和c2是一样的?

谢谢,
安。

1 个答案:

答案 0 :(得分:5)

如果您将(.)的类型视为

(b2 -> c2) -> (a2 -> b2) -> (a2 -> c2)

然后

b1 ~ (a2 -> b2)
b1 ~ (a2 -> c2)

所以(b2 ~ c2)

然后您可以看到(foldr (.))的类型

(a2 -> b2) -> [(b2 -> b2)] -> (a2 -> b2)

这是GHC派生的类型。