
On Mon, Oct 13, 2003 at 06:32:14PM +0100, Jose Morais wrote:
Hi,
What I needed was actualy something more like
f3 :: Int -> String f3 x = show x ++ f4 x
f4 :: Int -> IO String f4 x = do putStr ("initial value is " ++ show x) return (show x)
but this gives the error
Type checking ERROR "teste.hs":11 - Type error in application *** Expression : show x ++ f4 x *** Term : f4 x *** Type : IO String *** Does not match : [a]
Can you help me?
Thank you
Your problem is that once you use the IO Monad in a function, every function that calls it must use IO as well. (If a function you call has side-effects then you have side-effects by association.) The following version of f3 should fix your problem: f3 :: Int -> IO String f3 x = do x' <- f4 x return (show x ++ x') This code first extracts the String from the IO String returned by f4 and binds it to the variable x'. x' is now just a plain String which can be concat'd onto other strings, which is what we do in the second line. I hope this helps, -- -------------------------------------------------- Jason Wilcox CS Tutor Coordinator jasonw@cs.pdx.edu 503.725.4023 tutors@cs.pdx.edu www.cat.pdx.edu FAB 135-01 --------------------------------------------------