Deriving the type of (foldr (.))
问题 I'm trying to manually derive the type of (foldr (.)) foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1 (.) ::(b2 -> c2) -> (a2 -> b2) -> a2 -> c2 Then: a1 ~ (b2 -> c2) b1 ~ (a2 -> b2) b1 ~ a2 So I get that (foldr (.)) :: (a2 -> b2) -> [(b2 -> c2)] -> (a2 -> b2) But GHCi returns: :t (foldr (.)) :: (a -> b) -> [b -> b] -> a -> b Why b2 and c2 are the same? Thanks, Sebastián. 回答1: If you look at the type of (.) as (b2 -> c2) -> (a2 -> b2) -> (a2 -> c2) then b1 ~ (a2 -> b2) b1 ~ (a2 -> c2) so (b2 ~