<br><br><div class="gmail_quote">On Mon, Dec 15, 2008 at 12:17 PM, Jeff C. Britton <span dir="ltr">&lt;<a href="mailto:jcb@iteris.com">jcb@iteris.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;">
Hello,<br>
<br>
I have started reading &quot;Yet Another Haskell Tutorial&quot; by Hal DaumĀ“e III which can be found here<br>
<a href="http://www.cs.utah.edu/%7Ehal/docs/daume02yaht.pdf" target="_blank">http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf</a><br>
<br>
One of the early examples in section 3.8 pg. 35<br>
is this<br>
<br>
askForWords = do<br>
 &nbsp;putStrLn &quot;Please enter a word:&quot;<br>
 &nbsp;word &lt;- getLine<br>
 &nbsp;if word == &quot;&quot;<br>
 &nbsp; &nbsp;then return []<br>
 &nbsp; &nbsp;else do<br>
 &nbsp; &nbsp; &nbsp;rest &lt;- askForWords<br>
 &nbsp; &nbsp; &nbsp;return (word : rest)<br>
<br>
I want to print the returned list and everything I try fails.<br>
<br>
I have tried the following:<br>
<br>
printList l =<br>
 &nbsp;if length l &gt;= 1<br>
 &nbsp; &nbsp;then do putStrLn (head l)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printList (tail l)<br>
 &nbsp; &nbsp;else putStrLn(&quot;&quot;)<br>
<br>
f = printList askForWords<br>
<br>
and I get<br>
Expression &nbsp; &nbsp; : printList askForWords<br>
*** Term &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : askForWords<br>
*** Type &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : IO [[Char]]<br>
*** Does not match : [[Char]]</blockquote><div><br>I believe one of the following will work for you:<br><br>f = askForWords &gt;&gt;= printList<br>f = do<br>&nbsp; &nbsp; &nbsp; &nbsp; words &lt;- askForWords<br>&nbsp; &nbsp; &nbsp; &nbsp; printList words<br>&nbsp;<br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
<br>
*************************************<br>
The exercise right below this asks for a very slight modification to read numbers instead.<br>
<br>
However, I am confused about how to convert strings to numbers.<br>
If I type in the hugs interactive console<br>
read &quot;5&quot; + 3 --&gt; 8 &nbsp; &nbsp; -- ok perfect<br>
<br>
However<br>
read &quot;5&quot; gives<br>
ERROR - Unresolved overloading<br>
*** Type &nbsp; &nbsp; &nbsp; : Read a =&gt; a<br>
*** Expression : read &quot;5&quot;<br>
<br>
Yet page 33 of the tutorial has the following code:<br>
doGuessing num = do<br>
 &nbsp;putStrLn &quot;Enter your guess:&quot;<br>
 &nbsp;guess &lt;- getLine<br>
 &nbsp;let guessNum = read guess &nbsp;-- ok in let stmt, but not at repl prompt?</blockquote><div><br>The problem here is type inference. The statement read &quot;5&quot; has type &quot;(Read a) =&gt; a&quot;, which basically means anything that implements the class &quot;Read.&quot; When you do read &quot;5&quot; + 3, the read &quot;5&quot; gets the type of the 3. I assume that in the latter case, you use the expression guessNum in a way later on that the compiler can infer its type. <br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
<br>
Anyway I take the info that has been presented and create this function:<br>
askForNumbers = do<br>
 &nbsp; &nbsp;hSetBuffering stdin LineBuffering<br>
 &nbsp; &nbsp;putStrLn &quot;Give me a number (or 0 to stop)&quot;<br>
 &nbsp; &nbsp;numStr &lt;- getLine<br>
 &nbsp; &nbsp;let num = read numStr<br>
 &nbsp; &nbsp;if num == 0<br>
 &nbsp; &nbsp; &nbsp; &nbsp;then return []<br>
 &nbsp; &nbsp; &nbsp; &nbsp;else do<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rest &lt;- askForNumbers<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return (num : rest)<br>
<br>
However, when I try to use it, like say<br>
<br>
map sqrt askForNumbers<br>
<br>
ERROR - Type error in application<br>
*** Expression &nbsp; &nbsp; : map sqrt askForNumbers<br>
*** Term &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : askForNumbers<br>
*** Type &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : IO [Integer]<br>
*** Does not match : [a]</blockquote><div><br>Similar to above, try this:<br>do nums &lt;- askForNumbers<br>&nbsp; &nbsp; map sqrt nums<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
*********************************************************<br>
<br>
Is there a way to write printList to handle Strings or numbers?<br>
Or should I write<br>
printList (map show askForNumbers)</blockquote><div><br>Note: you should probably do this using mapM_, but for simplicity, I&#39;ll do it using explicit recursion:<br><br><span style="font-family: courier new,monospace;">printList [] = putStrLn &quot;&quot; -- or return () if you don&#39;t want the extra blank line</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">printList (x:xs) = do putStrLn (show x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printList xs<br><br></span>If you have any questions about how these worked, let me know!<br></div></div><br>
Michael<br>