Actually GHC *does* pass around a RealWorld token right through the optimiser. Just at the moment of code generation we drop it, so that it's not *actually* passed. But for almost all of compilation it's just as if it *was*.
Simon | -----Original Message----- | From: [email protected] [mailto:[email protected]] On | Behalf Of Lennart Augustsson | Sent: 21 August 2009 11:04 | To: Peter Verswyvelen | Cc: Bayley, Alistair; The Haskell Cafe | Subject: Re: Re[2]: [Haskell-cafe] Re: Where do I put the seq? | | You need a lot of magic to make the IO monad efficient. | You don't really want to pass around (and pattern match on) a | RealWorld token, that would be inefficient. | | | On Fri, Aug 21, 2009 at 11:04 AM, Peter Verswyvelen<[email protected]> wrote: | > IO also seems to use unboxed (hence strict?) tuples | > | > newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #)) | > | > Not sure if this is just for performance, but if the strictness is required, | > here we have the horrible hack again then (would behave different without | > it?). I guess it works because when applying primitive function likes | > putChar#, these could be considered as fully strict, since putChar# c really | > does force evaluation of c strictly and puts in the screen. This is | > different from the lazy IO situation, where a string is concatenated lazily, | > and put on the screen by the consumer as soon as it's available. Ah I'm | > having troubles to explain myself formally, never mind :) | > Actually RealWorld is not defined in that file, it is defined here, but | > hidden | > file:///C:/app/ghp/doc/libraries/ghc-prim/GHC-Prim.html#t%3ARealWorld | > But I don't understand the comment | > data RealWorld Source | > RealWorld is deeply magical. It is primitive, but it is | > not unlifted (hence ptrArg). We never manipulate values of type RealWorld; | > it's only used in the type system, to parameterise State#. | > Maybe I should reread the papers, but it seems lots of magic is needed to | > get IO right (such as the existential types to make sure different state | > threads are kept separate) | > On Fri, Aug 21, 2009 at 10:52 AM, Bayley, Alistair | > <[email protected]> wrote: | >> | >> > From: [email protected] | >> > [mailto:[email protected]] On Behalf Of Bulat Ziganshin | >> > To: Peter Verswyvelen | >> > | >> > > But how does GHC implement the RealWorld internally? I guess | >> > | >> > look the "base" library sources for "RealWorld" | >> | >> http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/GHC-IOBas | >> e.html#IO | >> ***************************************************************** | >> Confidentiality Note: The information contained in this message, | >> and any attachments, may contain confidential and/or privileged | >> material. It is intended solely for the person(s) or entity to | >> which it is addressed. Any review, retransmission, dissemination, | >> or taking of any action in reliance upon this information by | >> persons or entities other than the intended recipient(s) is | >> prohibited. If you received this in error, please contact the | >> sender and delete the material from any computer. | >> ***************************************************************** | >> | > | > | > _______________________________________________ | > Haskell-Cafe mailing list | > [email protected] | > http://www.haskell.org/mailman/listinfo/haskell-cafe | > | > | _______________________________________________ | Haskell-Cafe mailing list | [email protected] | http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
