Hello Haskellers,<br><br>    I isolated to a not so small piece:<br><br>&gt; {-# OPTIONS -fglasgow-exts #-}<br>&gt; {-# LANGUAGE UndecidableInstances #-}<br><br><br>&gt; import Control.Monad.Identity<br>&gt; import Control.Monad.Reader<br>
&gt; import Control.Monad.State<br>&gt; import qualified Data.List as L<br>&gt; import qualified Data.Map as M<br>&gt; import Data.Array<br><br>import IOExts<br><br><br>The type of a regular expression.<br><br>&gt; data Re t<br>
&gt;   = ReOr [Re t]<br>&gt;   | ReCat [Re t]<br>&gt;   | ReStar (Re t)<br>&gt;   | RePlus (Re t)<br>&gt;   | ReOpt (Re t)<br>&gt;   | ReTerm [t]<br>&gt;       deriving (Show)<br><br><br>The internal type of a regular expression.<br>
<br>&gt; type SimplRe t = Int<br>&gt; data SimplRe&#39; t<br>&gt;   = SReOr (SimplRe t) (SimplRe t)<br>&gt;   | SReCat (SimplRe t) (SimplRe t)<br>&gt;   | SReStar (SimplRe t)<br>&gt;   | SReLambda<br>&gt;   | SReNullSet<br>
&gt;   | SReTerm t<br>&gt;       deriving (Eq, Ord, Show)<br><br><br>The regular expression builder monad.<br><br>&gt; data (Ord t) =&gt; ReRead t<br>&gt;  = ReRead {<br>&gt;       rerNullSet      :: SimplRe t,<br>&gt;       rerLambda       :: SimplRe t<br>
&gt;  }<br><br>&gt; data (Ord t) =&gt; ReState t<br>&gt;   = ReState {<br>&gt;       resFwdMap       :: M.Map (SimplRe t) (ReInfo t),<br>&gt;       resBwdMap       :: M.Map (SimplRe&#39; t) (SimplRe t),<br>&gt;       resNext         :: Int,<br>
&gt;       resQueue        :: ([SimplRe t], [SimplRe t]),<br>&gt;       resStatesDone   :: [SimplRe t]<br>&gt;     }<br><br>&gt; type ReM m t a = StateT (ReState t) (ReaderT (ReRead t) m) a<br><br>TEMP  WNH<br>Dfa construction<br>
<br>&gt; data ReDfaState t<br>&gt;   = ReDfaState {<br>&gt;         dfaFinal :: Bool,<br>&gt;       dfaTrans :: [(t, SimplRe t)]<br>&gt;   }<br>&gt;       deriving (Show)<br><br>TEMP WNH<br>The ReInfo type<br><br>&gt; data ReInfo t<br>
&gt;   = ReInfo {<br>&gt;       reiSRE          :: SimplRe&#39; t,<br>&gt;       reiNullable     :: Bool,<br>&gt;       reiDfa          :: Maybe (ReDfaState t)<br>&gt;     }<br>&gt;       deriving (Show)<br><br>TEMP WNH<br>
<br><br>&gt; class (Monad m, Ord t) =&gt; ReVars m t where { }<br>&gt; instance (Monad m, Ord t) =&gt; ReVars m t where { }<br><br>TEMP WNH<br><br>&gt; remLookupFwd :: (ReVars m t) =&gt; SimplRe t -&gt; ReM m t (ReInfo t)<br>
&gt; remLookupFwd re<br>&gt;   = do fwd &lt;- gets resFwdMap<br>&gt; --       let { Just reinfo = M.lookup fwd re }                    -- PROBLEM<br>&gt;        reinfo &lt;- M.lookup fwd re                     -- PROBLEM<br>
&gt;        return reinfo<br><br><br>When I &quot;compile&quot; with ghci I get:<br><br><br>Dfa_exp.lhs:91:32:<br>    Couldn&#39;t match expected type `M.Map<br>                                    (M.Map (SimplRe t) (ReInfo t)) t1&#39;<br>
           against inferred type `SimplRe t2&#39;<br>    In the second argument of `M.lookup&#39;, namely `re&#39;<br>    In a &#39;do&#39; expression: reinfo &lt;- M.lookup fwd re<br>    In the expression:<br>        do fwd &lt;- gets resFwdMap<br>
           reinfo &lt;- M.lookup fwd re<br>           return reinfo<br><br>I trimmed the original code down a lot! But still can&#39;t why I am getting type check errors!!! Help!<br><br>Kind regards,<br><br>Vasili<br><br>
<br><br><br><br><br>