0

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.

Fof
  • 407
  • 2
  • 8
  • You realise you're contradicting yourself with `b1 ~ (a2 -> b2)` ∧ `b1 ~ a2`? (Actually it's not really contradiction, but it'd be an "infinite type" which you can't have in Haskell.) – leftaroundabout May 01 '14 at 22:45
  • @leftaroundabout But if I query GHCi for the type of (foldr (.)) I get (a -> b) -> [b -> b] -> a -> b. – Fof May 01 '14 at 22:48

1 Answers1

5

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.

Lee
  • 142,018
  • 20
  • 234
  • 287