<p>On Dec 26, 2010 2:01 PM, &quot;michael rice&quot; &lt;<a href="mailto:nowgate@yahoo.com">nowgate@yahoo.com</a>&gt; wrote:<br>
&gt;<br>
&gt; I lifted the code below from here:<br>
&gt;<br>
&gt; <a href="http://en.wikibooks.org/wiki/Haskell/Monad_transformers">http://en.wikibooks.org/wiki/Haskell/Monad_transformers</a><br>
&gt;<br>
&gt; Since the wiki page doesn&#39;t say what needs to be imported, I&#39;m guessing.<br>
&gt;<br>
&gt; Not sure what is happening. Maybe someone can tell me. <br>
&gt;<br>
&gt; Michael<br>
&gt;</p>
<p>I haven&#39;t had a chance to dig into your example, but you might want to try the maybeT library:</p>
<p><a href="http://hackage.haskell.org/package/MaybeT">http://hackage.haskell.org/package/MaybeT</a></p>
<p>That way you could try to narrow down where the error is coming from.</p>
<p>Take care,<br>
Antoine</p>
<p>&gt; ==============<br>
&gt;<br>
&gt; import Control.Monad<br>
&gt; import Control.Monad.Trans.Class<br>
&gt; import Data.Char<br>
&gt;<br>
&gt; newtype (Monad m) =&gt; MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }<br>
&gt;<br>
&gt; instance Monad m =&gt; Monad (MaybeT m) where<br>
&gt;     return  = MaybeT . return . Just<br>
&gt;     x &gt;&gt;= f = MaybeT $ do maybe_value &lt;- runMaybeT x<br>
&gt;                           case maybe_value of<br>
&gt;                                Nothing    -&gt; return Nothing<br>
&gt;                                Just value -&gt; runMaybeT $ f value<br>
&gt;<br>
&gt; instance Monad m =&gt; MonadPlus (MaybeT m) where<br>
&gt;     mzero     = MaybeT $ return Nothing<br>
&gt;     mplus x y = MaybeT $ do maybe_value &lt;- runMaybeT x<br>
&gt;                             case maybe_value of<br>
&gt;                                  Nothing    -&gt; runMaybeT y<br>
&gt;                                  Just value -&gt; runMaybeT x<br>
&gt;  <br>
&gt; instance MonadTrans MaybeT where<br>
&gt;     lift = MaybeT . (liftM Just)<br>
&gt;<br>
&gt; instance Show (MaybeT m a)<br>
&gt;<br>
&gt; getValidPassword :: MaybeT IO String<br>
&gt; getValidPassword = do s &lt;- lift getLine<br>
&gt;                       guard (isValid s)<br>
&gt;                       return s<br>
&gt;<br>
&gt; isValid :: String -&gt; Bool<br>
&gt; isValid s = (length s &gt; 8) &amp;&amp;<br>
&gt;             ((filter isAlphaNum  s) == s) &amp;&amp;<br>
&gt;             any isDigit s &amp;&amp;<br>
&gt;             any isAlpha s               <br>
&gt;              <br>
&gt; askPassword :: MaybeT IO ()<br>
&gt; askPassword = do lift $ putStrLn &quot;Insert your new password:&quot;<br>
&gt;                  value &lt;- getValidPassword<br>
&gt;                  lift $ putStrLn &quot;Storing in database...&quot;<br>
&gt;<br>
&gt; =============<br>
&gt;<br>
&gt; [michael@localhost ~]$ ghci<br>
&gt; GHCi, version 6.12.3: <a href="http://www.haskell.org/ghc/">http://www.haskell.org/ghc/</a>  :? for help<br>
&gt; Loading package ghc-prim ... linking ... done.<br>
&gt; Loading package integer-gmp ... linking ... done.<br>
&gt; Loading package base ... linking ... done.<br>
&gt; Loading package ffi-1.0 ... linking ... done.<br>
&gt; Prelude&gt; :l test5<br>
&gt; [1 of 1] Compiling Main             ( test5.hs, interpreted )<br>
&gt; Ok, modules loaded: Main.<br>
&gt; *Main&gt; askPassword<br>
&gt; Loading package transformers-0.2.2.0 ... linking ... done.<br>
&gt; *** Exception: stack overflow<br>
&gt; *Main&gt; <br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
</p>