Question

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.

Was it helpful?

Solution

If you look at the type of (.) as

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

then

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

so (b2 ~ c2)

then you can see the type of (foldr (.)) is

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

which is the type GHC derives.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top