[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):
Give me a number (or 0 to stop):
Give me a number (or 0 to stop):
Give me a number (or 0 to stop):
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

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

getList = do
  putStrLn "Give me a number (or 0 to stop):"
  numString <- getLine
  let num = read numString
  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.



More information about the Haskell-Cafe mailing list