
I believe 'tackling the awkward squad' explains the World parameter.
http://research.microsoft.com/~simonpj/papers/marktoberdorf/
Indeed this is the 'World' parameter. It's quite easy to see why it's needed. Image the getChar function ... getChar :: IO Char if we imagine that the World parameter wasn't present, this would make the type of getChar. getChar :: _E Char Since _E is just a box this is basically the same as. getChar :: Char Since this doesn't take any arguments it's a CAF, i.e. a constant value. Since it's constant, every call to getChar would always return the same character! When we add the World parameter we turn getChar into. getChar :: World -> Char Now getChar takes an argument, so its value is no longer constant (its value can vary depending on the argument). Haskell neither knows, nor cares, that getChar doesn't even look at the World argument. As far as Haskell is concerned getChar has an argument so Haskell can't treat it like a constant. In other words, it's all some nasty trickery to make impure functions work correctly in Haskell ;) Hope that explains it :) Tom