Why does Haskell's "do nothing" function, id, consume tons of memory?

We know the type of id,

id :: a -> a

And when we specialize this for id id, the left copy of id has type:

id :: (a -> a) -> (a -> a)

And then when you specialize this again for the leftmost id in id id id, you get:

id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))

So you see each id you add, the type signature of the leftmost id is twice as large.

Note that types are deleted during compilation, so this will only take up memory in GHC. It won't take up memory in your program.