[Haskell] Monads vs. continuations

Gregory Woodhouse gregory.woodhouse at sbcglobal.net
Mon Oct 31 01:14:29 EST 2005

Newbie alert:

I have some superficial familiarity with continuations as they occur  
in traditional denotational semantics, but certainly not a deep  
understanding. I also have a special interest in distributed and/or  
concurrent processing, so it only seemed natural to me that the monad  
concept was one I'd want to confront head on. Now, I warn you: I am  
quite new to Haskell (though I have some prior exposure to Scheme and  
a background in mathematics). Now, I've just started reading through  
Thompson's text and came across this example:

goUntilEmpty :: IO ()
= do line <- getLine
          if (line == [])
            then return ()
           else (do putStrLn line

Okay, this seems sensible enough. Loosely speaking, I see this code  
as getting a line, checking to see if it's empty. If it is, it just  
quits (returning the "empty" value). Otherwise, it prints line, and  
invokes itself through a *new* do statement. That seems awfully like  
using a continuation to track the input stream as part of the  
environment. But it seems obvious to me that here is something I'm  
not understanding here. I think of the do as providing an appropriate  
continuation (one in which the line just read is gone) to pass to the  
next call.

Okay, maybe I'm taking things a bit too literally here, but I seem to  
recall that a monad is an algebraic object with right and left  
identity and an associative composition. I understand the monad here  
takes a value (()) and returns an object IO (), and do becomes a  
functor of sorts, taking ordinary functions and mapping them to new  
functions having their codomain in a new category (an instance of a  
monad?) This is where it seems to me that I must be getting the  
terminology wrong. Can someone help me out here?

Gregory Woodhouse
gregory.woodhouse at sbcglobal.net

"The most incomprehensible thing about
the world is that it is at all comprehensible."
  --Albert Einstein (1879-1955)

More information about the Haskell mailing list