[Haskell] IORef sharing
Brandon S. Allbery KF8NH
allbery at ece.cmu.edu
Mon Oct 27 20:37:38 EDT 2008
On 2008 Oct 27, at 20:25, Rodney D Price wrote:
> Okay... However, when I use IO in a Haskell program,
> the response is usually pretty snappy. It's not as
> if the Haskell runtime is hanging around, waiting for
> some time in the future when it might be appropriate
> to do IO. It happens right now. Yet the literature
> gives the impression that the IO monad in particular
> is a clever trick to preserve referential transparency
> by gathering up all the IO actions, but not necessarily
> actually *performing* them. Then the Haskell runtime
> holds its nose and *performs* them when necessary.0
The *conceptual* model for the IO monad is that "main" returns a big
IO action which is then evaluated by the Haskell runtime.
As a practical matter, this usually behaves the same as if <- actually
did evaluation. (It doesn't. It binds monadic expressions together,
and is a convenient way to use the (>>=) operator.) The one
difference is its interaction with Haskell equations (a = b); since
those are more or less macro definitions, assigning e.g. an expression
of type IO String to such a "macro" will cause the expression to be
substituted wherever the "macro" is used.
IO is a very atypical monad, by the way. Someone pointed you earlier
to the "IO Inside" page, which describes the internal tricks that make
IO work. I prefer to think of IO actions as partially applied
functions, with the missing argument being a "RealWorld" that is
hidden inside the IO monad. (think: IO a = State RealWorld a. This
isn't quite correct because the state also has IORefs inside it.)
--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
electrical and computer engineering, carnegie mellon university KF8NH
More information about the Haskell
mailing list