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.