[Haskell-cafe] Re: philosophy of Haskell

Tillmann Rendel rendel at Mathematik.Uni-Marburg.de
Sun Aug 15 13:27:37 EDT 2010

Brandon S Allbery KF8NH wrote:
> I am confused by this discussion.  I originally thought some time back that
> IO was about "world passing", but in fact it's just handing off a baton to
> insure that a particular sequence of IO functions is executed in the
> specified sequence and not reordered.  Nothing in the "baton" is intended to
> represent the actual "state of the world", nor is anything said about
> concurrent actions either in another thread of the current program or
> elsewhere outside the program; only ordering of calls in the *current*
> thread of execution.

That explains how the IO monad forces side-effecting functions into a 
specified sequence, but this discussion is about how to understand what 
these side-effecting functions do in a *pure* framework. So the idea is 
to regard, for example, putStr as a pure function from a world state to 
a different world state, assuming that the world state contains a String 
which represents the contents of the terminal. We could then implement 
and understand putStr in pure Haskell:

   data World = World {
     terminal :: String

   type IO a = World -> (World, a)

   putStr :: String -> World -> (World, ())
   putStr str world = (world {terminal = terminal world ++ str}, ())

The benefit of this point of view is that we can analyze the behavior of 
putStr. For example, by equational reasoning, we could derive the 
following equation:

   putStr s1 >> putStr s2   ==   putStr (s1 ++ s2)

It seems that we can account for more features of IO by adding more 
fields to the World record. This discussion is about whether we can 
account for *all* of IO this way.


More information about the Haskell-Cafe mailing list