[Haskell-cafe] newbie - IO issues (of course)
Jason Dagit
dagit at eecs.oregonstate.edu
Sat Jun 24 01:47:03 EDT 2006
On 6/23/06, Geoffrey King <lordgeoffrey at optushome.com.au> 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
More information about the Haskell-Cafe
mailing list