The recursive do-notation
--------------------------

The recursive do-notation (also known as mdo-notation) is implemented 
as described in:

   "A recursive do for Haskell", Levent Erkok, John Launchbury",
    Haskell Workshop 2002, pages: 29-37. Pittsburgh, Pennsylvania. 

The do-notation of Haskell does not allow recursive bindings, that is, 
the variables bound in a do-expression are visible only in the textually 
following code block. Compare this to a let-expression, where bound 
variables are visible in the entire binding group. It turns out that 
several applications can benefit from recursive bindings in the do-notation, 
and this extension provides the necessary syntactic support.

Here is a simple (yet contrived) example:

     import Control.Monad.Fix

     justOnes = mdo xs <- Just (1:xs)
                    return xs

As you can guess justOnes will evaluate to Just [1,1,1,...

The Control.Monad.Fix library introduces the MonadFix class. It's 
definition is:

     class Monad m => MonadFix m where
         mfix :: (a -> m a) -> m a

The function mfix dictates how the required recursion operation should 
be performed. If recursive bindings are required for a monad, then that 
monad must be declared an instance of the MonadFix class. For details, 
see the above mentioned reference.

The following instances of MonadFix are automatically provided: List, 
Maybe, IO. Furthermore, the Control.Monad.ST and Control.Monad.ST.Lazy 
modules provide the instances of the MonadFix class for Haskell's internal 
state monad (strict and lazy, respectively).

There are three important points in using the recursive-do notation:

  1. The recursive version of the do-notation uses the keyword mdo (rather
     than do).
  2. You should "import Control.Monad.Fix"
  3. Hugs should be started with the flag -98.

The web page: "http://www.cse.ogi.edu/PacSoft/projects/rmb"
contains up to date information on recursive monadic bindings.

Historical note: The old implementation of the mdo-notation (and most
of the existing documents) used the name "MonadRec" for the class and
the corresponding library. Hugs continues to support this name
in the "old-libraries" style (i.e., with the option -N). However, this
name is now deprecated, programmers should use the name "MonadFix", and
the hierarchical library structure.
