[Haskell-cafe] newbie help
Cale Gibbard
cgibbard at gmail.com
Fri Nov 4 02:52:27 EST 2005
On 04/11/05, Abhijit Ray <avizit at gmail.com> wrote:
> Hi I just started on haskell , i am using the yet another haskell
> tutorial by Hal Daume
>
> I wrote the following program and it dint compile.
> what's wrong with it
>
> module Main
> where
>
> import IO
>
> main = do
> hSetBuffering stdin LineBuffering
> let testList = makeList
> let sum = foldr (+) 0 testList
> putStrLn "Sum is " ++ show(sum)
>
> makeList = do
> putStrLn "enter a num"
> num <- getLine
> let nbr = read num
> if nbr == 0
> then do
> return []
> else do
> all <- makeList
> return (nbr : all)
> ----------------------------------------------
> the error i get is
>
> Chasing modules from: Sum.hs
> Compiling Main ( Sum.hs, Sum.o )
>
> Sum.hs:6:
> Couldn't match `[a]' against `IO ()'
> Expected type: [a]
> Inferred type: IO ()
> In the application `putStrLn "Sum is "'
> In the first argument of `(++)', namely `putStrLn "Sum is "'
>
> Sum.hs:9:
> Couldn't match `[b]' against `IO [a]'
> Expected type: [b]
> Inferred type: IO [a]
> In the third argument of `foldr', namely `testList'
> In the definition of `sum': sum = foldr (+) 0 testList
> -----------------------------
>
> Thanks,
> Abhijit Ray
Hello,
The first error is related to the way in which the following line parses:
> putStrLn "Sum is " ++ show(sum)
which is like:
(putStrLn "Sum is") ++ (show sum)
It's complaining that you're passing an IO action to (++). It's an
easy fix, add some parens, or a well-placed ($):
putStrLn $ "Sum is" ++ show sum
The second problem arises due to not running the IO action you wanted to:
> main = do
> hSetBuffering stdin LineBuffering
> let testList = makeList
> let sum = foldr (+) 0 testList
> putStrLn $ "Sum is " ++ show sum
What is the type of testList? Well, it must be the same as makeList --
what is makeList's type? The definition of makeList is in the form of
a do-block which carries out an IO computation producing a list of
numbers, so it's (Num a) => IO [a]. Note that this is not a list, so
it's unsuitable for passing to foldr.
What do we do? We run the IO action using "<-":
> main = do
> hSetBuffering stdin LineBuffering
> testList <- makeList
> let sum = foldr (+) 0 testList
> putStrLn $ "Sum is " ++ show sum
This will cause the running of main to *run* the IO action makeList,
getting the result into the list testList, which now has type (Num a)
=> [a] (here a is going to be defaulted to Integer, since nothing says
otherwise, and one needs to pick something to be able to read).
Hope this helps, and good luck with Haskell :)
- Cale
More information about the Haskell-Cafe
mailing list