To make that a little clearer, here is code that uses two calls to fmap to drill through two monadic layers:<br>f :: [Int] -&gt; IO [Int]<br>f lst = do return lst<br><br>main = do let lst = f [1,2,3,4,5]<br>          fmap (fmap (+1)) lst<br>
<br>So the order of operations is :<br>1. The first fmap converts an IO [Int] to [Int] and hands it off to the second fmap <br>2. The second fmap  applies the (+1) function to every element of the list.<br>3. The second fmap re-wraps the elements back into a [Int]<br>
4. The first fmap re-wraps and returns the transformed [Int] into an IO [Int].<br><br>-deech<br><br><br><div class="gmail_quote">On Fri, Dec 17, 2010 at 3:27 PM, aditya siram <span dir="ltr">&lt;<a href="mailto:aditya.siram@gmail.com">aditya.siram@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">I think it is giving you the error because you the &quot;fmap&quot; in your code is operating on the IO monad and not the List monad. In order to get it to work, you can remove the IO layer with &quot;&gt;&gt;=&quot; as below:<div class="im">
<br>
<br>f :: [Int] -&gt; IO [Int]<br>f lst = do return lst<br><br>main = do let lst = f [1,2,3,4,5]<br></div>          lst &gt;&gt;= return . fmap (+1) <br><br>Or you can not wrap the list in IO to begin with, my guess is that you wrote &#39;f&#39; to make the compiler happy at some point in development:<br>

main = do let lst = [1,2,3,4,5]<br>          return $ fmap (+1) lst<br><br>-deech<br><br><div class="gmail_quote"><div><div></div><div class="h5">On Fri, Dec 17, 2010 at 11:04 AM, michael rice <span dir="ltr">&lt;<a href="mailto:nowgate@yahoo.com" target="_blank">nowgate@yahoo.com</a>&gt;</span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><div></div><div class="h5"><table border="0" cellpadding="0" cellspacing="0">
<tbody><tr><td style="font: inherit;" valign="top">
<span style="font-family: courier,monaco,monospace,sans-serif;">I don&#39;t understand this error message. Haskell appears not to understand that 1 is a Num.<br><br>Prelude&gt; :t 1<br>1 :: (Num t) =&gt; t<br>Prelude&gt; :t [1,2,3,4,5]<br>

[1,2,3,4,5] :: (Num t) =&gt; [t]<br>Prelude&gt; <br><br>Michael<br><br>===================<br><br>f :: [Int] -&gt; IO [Int]</span><br style="font-family: courier,monaco,monospace,sans-serif;"><span style="font-family: courier,monaco,monospace,sans-serif;">f lst = do return lst</span><br style="font-family: courier,monaco,monospace,sans-serif;">

<br style="font-family: courier,monaco,monospace,sans-serif;"><span style="font-family: courier,monaco,monospace,sans-serif;">main = do let lst = f [1,2,3,4,5]</span><br style="font-family: courier,monaco,monospace,sans-serif;">

<span style="font-family: courier,monaco,monospace,sans-serif;">          fmap (+1) lst</span><br style="font-family: courier,monaco,monospace,sans-serif;"><br>===============================<br><br>Prelude&gt; :l test<br>

[1 of 1] Compiling Main             ( test.hs, interpreted )<br><br>test.hs:5:17:<br>    No instance for (Num [Int])<br>      arising from the literal `1&#39; at test.hs:5:17<br>    Possible fix: add an instance declaration for (Num [Int])<br>

    In the second argument of `(+)&#39;, namely `1&#39;<br>    In the first argument of `fmap&#39;, namely `(+ 1)&#39;<br>    In the expression: fmap (+ 1) lst<br>Failed, modules loaded: none.<br>Prelude&gt; <br></td></tr>

</tbody></table><br>

      <br></div></div>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>
</blockquote></div><br>