
Hello Geoffrey, Saturday, June 24, 2006, 8:38:31 AM, you wrote:
getInt :: IO Int getInt = do putStr "Enter number (zero to quit)" line <- getLine return (read line :: Int)
this procedure is fine, although there is specific function to read data of any type, which is just equivalent to getLine+read. using it, we can make routine even smaller: getInt :: IO Int getInt = do putStr "Enter number (zero to quit)" readLn
anIntList :: [Int] anIntList = do let n = getInt if n == 0 then return [] else return (n : anIntList)
IO monad cannot escape, so you can't use inside non-IO function (anIntList) an IO function (getInt) this have very simple explanation - Haskell is pure language, that meant that functions allways return the same results with same arguments. your anIntList don't have arguments, so it should return the same data on each call, really it's type signature meant that it just a constant! on the other side, return type "IO a" means that function can be called in IO monad context (such as inside "main") and may return different results even with the same arguments as conclusion, anIntList should have type "IO [Int]". try to write it yourself, i will help if you need it ps: i definitely will write wiki "introduction to monads and i/o" next week, it is so frequent source of beginner's troubles! -- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com