# [Haskell-cafe] Noob error: Type b -> c b Does not match IO a

kynn at panix.com kynn at panix.com
Thu Jun 23 00:17:58 EDT 2005

```--text follows this line--

I'm trying to learn Haskell from YAHT.

My attempt at a solution of Exercise 3.10 is failing with a "Type does
not match" error.  The exercise is to write a function that will read
numbers (one per line) from the command line, until the number 0 is
entered.  At this point the program is supposed to print out the sum
of the numbers, their product, and for each number, the factorial.
The interaction should resemble this:

Give me a number (or 0 to stop):
5
Give me a number (or 0 to stop):
8
Give me a number (or 0 to stop):
2
Give me a number (or 0 to stop):
0
The sum is 15
The product is 80
5 factorial is 120
8 factorial is 40320
2 factorial is 2

The code I have for this is given next (the line that fails is
indicated by a comment):

module Main
where

import IO

main = do
hSetBuffering stdin LineBuffering
numberList <- getList
let s = sumList numberList
let p = prodList numberList
putStrLn ("The sum is " ++ s)
putStrLn ("The product is " ++ p)
printFact numberList

fact 0 = 1
fact 1 = 1
fact x = x * fact x - 1

sumList [] = 0
sumList (x:xs) = x + sumList xs

prodList [] = 1
prodList (0:xs) = 0
prodList (x:xs) = x * prodList xs

printFact [] = return
printFact (x:xs) = do  -- triggers error message
putStrLn (x ++ " factorial is " ++ fact x)
printFact xs
return

getList = do
putStrLn "Give me a number (or 0 to stop):"
numString <- getLine
if num == 0
then return []
else return (num:getList)

Here's the full error I get (from HUGS):

IO> :l Ex3_10
ERROR "./Ex3_10.hs":28 - Type error in generator
*** Term           : printFact xs
*** Type           : b -> c b
*** Does not match : IO a

If anyone can explain to me how to fix this error I'd appreciate it.

Also, what is the difference between <- and let?

Lastly, any comments on any other detail of the code, particularly
coding, style are most welcome.

Thanks!

kj

```