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 at cs.pdx.edu 503.725.4023 tutors at cs.pdx.edu FAB 135-01 --------------------------------------------------