<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><div>I've been struggling with writing a parser that needs to parse include files within source files.&nbsp; So far I cannot get this to work (in reality to get work done I wrote a kludge that returns a list of include filenames to be run later in a pure IO function.&nbsp; I realized that this just amounted to creating my own half-assed monad system so I really don't want to use this approach).&nbsp; I have read the tutorials I could find on monad transformers but I still don't see what's going on.&nbsp; I'm using the Parsec parser library. Here's an simple example of what I've tried.&nbsp; I also tried using liftIO and got a message about needing to add an instance of MonadIO.&nbsp; This made more sense but the type of liftIO is baffling<br><br><span class="keyword">class</span> <a
 href="http://www.cis.upenn.edu/%7Ebcpierce/courses/advprog/resources/base/Prelude.html#t%3AMonad">Monad</a> m =&gt; <a name="t:MonadIO"></a><b>MonadIO</b> m  <span class="keyword">where</span><br>liftIO :: IO a -&gt; m a<br><br>But how do you define this function?&nbsp; There is no constructor for "IO a" that you can "take apart".<br><br>Anyway, here is the code that just uses lift. Keep in mind that the outer monad is just "GenParser Char st [Char]".&nbsp; I'm guessing this is wrong and I should have a transformer monad as the outer layer.&nbsp; But which one?&nbsp; and how to use it?<br><br>pio = do {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s &lt;- many1 alphaNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input &lt;- lift (readFile s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return input;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>go6 = runParser pio () "" "This is a
 test"<br><br>=================================<br>ghc output from trying to load this is<br>=================================<br><br><br>Couldn't match kind `* -&gt; * -&gt; *' against `(* -&gt; *) -&gt; * -&gt; *'<br>&nbsp;&nbsp;&nbsp; When matching the kinds of `GenParser Char :: * -&gt; * -&gt; *' and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `t :: (* -&gt; *) -&gt; * -&gt; *'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expected type: GenParser Char st<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inferred type: t IO<br>&nbsp;&nbsp;&nbsp; In a 'do' expression: lift (writeFile "Foo" s)<br><br></div></div><br>
      <hr size=1>Be a better Heartthrob. <a href="http://us.rd.yahoo.com/evt=48255/*http://answers.yahoo.com/dir/_ylc=X3oDMTI5MGx2aThyBF9TAzIxMTU1MDAzNTIEX3MDMzk2NTQ1MTAzBHNlYwNCQUJwaWxsYXJfTklfMzYwBHNsawNQcm9kdWN0X3F1ZXN0aW9uX3BhZ2U-?link=list&sid=396545433">Get better relationship answers </a>from someone who knows.<br>Yahoo! Answers - Check it out. 
</body></html>