On 6/23/06, Geoffrey King <[EMAIL PROTECTED]> wrote:
I have been work my way through "Haskell The Craft of Functional
Programming", all was fine until IO (chapter 18). That is causing me
bafflement.

I am trying to write a totally trivial program that reads a series of
integers from the console until it gets a zero, then returns the series
of integers as a list.

I am down to randomly editing my code, never a good sign. Any clues
would be appreciated, My code so far, which clear doesn't work, is:
getInt :: IO Int
getInt = do
            putStr "Enter number (zero to quit)"
            line <- getLine
            return (read line :: Int)

I haven't tested your code or my proposed changes, but let me step
through what you have and offer up explanations of what I think is
going wrong.

So here, things look pretty good with getInt.  getInt has type IO Int,
which makes sense because you do some work in the IO monad construct a
value and return it.  Since you can't escape the IO monad, getInt
returns an Int which is wrapped up in the IO monad.


anIntList :: [Int]
anIntList =
        do
            let n = getInt
            if n == 0
                then return []
                else return (n : anIntList)

Okay, so lets start with the let.  What is the type of n?  Well, it's
IO Int because that's the type of getInt.  But, IO Int isn't a number
so you can't do the test in the if.  Otherwise, your code looks pretty
good.



ps: even a simple version that returns an Int i can't get to work.
anInt :: Int
anInt = do
            n <- getInt
            return n

Now you're getting closer.  But, you do work in the IO monad and
construct a value and return it, so your type signature must be wrong.
It must be the case that anInt :: IO Int.  I see here that you know
how to grab 'unwrap' a value in the IO monad and work with it (the
line, n <- getInt), you should try doing this above where you have
'let n = getInt'.

You may also want to read these fine web pages:
http://www.haskell.org/hawiki/MonadsAsContainers
http://www.nomaware.com/monads/html/index.html

You're so close, I expect you'll have it figured out before I can hit send :)

HTH,
Jason
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to