instances is most interesting.
</para>
</sect2>
+
+<sect2 id="mdo-notation">
+<title>The recursive do-notation
+</title>
+
+<para> The recursive do-notation (a.k.a. mdo-notation) is implemented as described in
+"A recursive do for Haskell",
+Levent Erkok, John Launchbury",
+Haskell Workshop 2002, pages: 29-37. Pittsburgh, Pennsylvania.
+</para>
+<para>
+The do-notation of Haskell does not allow <emphasis>recursive bindings</emphasis>,
+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.
+</para>
+<para>
+Here is a simple (yet contrived) example:
+</para>
+<programlisting>
+import Control.Monad.MonadRec
+
+justOnes = mdo xs <- Just (1:xs)
+ return xs
+</programlisting>
+<para>
+There are three important points in using the recursive-do notation:
+<itemizedlist>
+<listitem><para>
+The recursive version of the do-notation uses the keyword <literal>mdo</literal> (rather
+than <literal>do</literal>).
+</para></listitem>
+
+<listitem><para>
+The scripts using <literal>mdo</literal> should <literal>import Control.Monad.MonadRec</literal>
+</para></listitem>
+
+<listitem><para>
+As with other extensions, ghc should be given the flag <literal>-fglasgow-exts</literal>
+</para></listitem>
+</itemizedlist>
+</para>
+
+<para>
+The MonadRec library introduces the <literal>MonadRec</literal> class. It's definition is:
+</para>
+<programlisting>
+class Monad m => MonadRec m where
+ mfix :: (a -> m a) -> m a
+</programlisting>
+<para>
+The <literal>MonadRec</literal> class declares the function <literal>mfix</literal>,
+which dictates how the recursion should behave. If recursive bindings are required for a monad,
+then that monad must be declared an instance of the <literal>MonadRec</literal> class.
+For details, see the above mentione reference.
+</para>
+<para>
+The MonadRec library automatically declares List, Maybe, IO, and
+state monads (both lazy and strict) as instances of the <literal>MonadRec</literal> class.
+</para>
+
+<para>
+The web page: <ulink url="http://www.cse.ogi.edu/PacSoft/projects/rmb">http://www.cse.ogi.edu/PacSoft/projects/rmb</ulink>
+contains up to date information on recursive monadic bindings.
+</para>
+
+</sect2>
</sect1>