Got it. Many thanks to Thomas Davie&#39;s and Andrew Wagner&#39;s replies.  ^_^<br><br><div class="gmail_quote">On Fri, Mar 20, 2009 at 9:00 PM, Thomas Davie <span dir="ltr">&lt;<a href="mailto:tom.davie@gmail.com">tom.davie@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5"><br>
On 20 Mar 2009, at 13:45, ZelluX wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi, all<br>
<br>
I&#39;m new to haskell and currently reading yaht. I find some problems when trying to solve exercise 3.10.<br>
<br>
The exersices asks to read a list of numbers terminated by a zero, and figure out the sum and product of the list. My program is as follows:<br>
<br>
ex3_10 = do<br>
  hSetBuffering stdin LineBuffering<br>
  numbers &lt;- getNumber<br>
  let sum = foldr (+) 0 numbers<br>
      product = foldr (*) 1 numbers<br>
  putStrLn &quot;The sum is &quot; ++ show(sum)<br>
  putStrLn &quot;The product is &quot; ++ show(product)<br>
<br>
getNumber = do<br>
  putStrLn &quot;Give me a number (or 0 to stop):&quot;<br>
  num &lt;- getLine<br>
  if read num == 0<br>
     then return []<br>
     else do<br>
       rest &lt;- getNumber<br>
       return (read num : rest)<br>
<br>
But when i load the program, ghci reports error:<br>
    Couldn&#39;t match expected type `[a]&#39; against inferred type `IO ()&#39;<br>
    In the first argument of `(++)&#39;, namely `putStrLn &quot;The sum is &quot;&#39;<br>
    In a stmt of a &#39;do&#39; expression:<br>
          putStrLn &quot;The sum is &quot; ++ show (sum)<br>
<br>
And i just don&#39;t understand the first sentence. Could you tell what does it mean?<br>
</blockquote>
<br></div></div>
It means that you can&#39;t use ++ on an IO action, ++&#39;s type reveals why:<br>
<br>
(++) :: [a] -&gt; [a] -&gt; [a]<br>
<br>
It accepts two lists, not a list and an IO action.  So the question then is, which IO action are you using ++ on?  The answer is (putStrLn &quot;The sum is&quot;).  Your last two statements are being parsed as:<br>
<br>
(putStrLn &quot;The sum is &quot;) ++ (show sum)<div class="im"><br>
(putStrLn &quot;The product is &quot;) ++ (show product)<br>
<br></div>
As a random aside, it&#39;s usually a good plan in Haskell to get out of IO based computations as fast as possible, and use pure functions instead.  You might want to consider something like this:<br>
<br>
ex3_10 = do<br>
  hSetLineBuffering stdin LineBuffering<br>
  interact sumAndProduct<br>
<br>
sumAndProduct :: String -&gt; String<br>
sumAndProduct = (\ns -&gt; sumText ns ++ productText ns) . map read . lines<br>
<br>
sumText :: (Num a, Show a) =&gt; [a] -&gt; String<br>
sumText = (&quot;The sum is &quot; ++) . show . sum<br>
<br>
productText :: (Num a, Show a) =&gt; [a] -&gt; String<br>
productText = (&quot;The product is &quot; ++) . show . product<br>
<br>
Why might you want to do this?  Well, firstly, the code becomes more readable, secondly, a computation that was not sequential is no longer described as being sequential, and finally, the results are more composible.  We can now use sumText and productText, safe in the knowledge that they will never have side effects etc.<br>

<br>
Bob<br>
<br>
</blockquote></div><br>