On Sun, 24 Nov 2002 09:05:17 -0900 "Lu Mudong" <[EMAIL PROTECTED]> wrote:
> Thanks a lot for you guys' help. > > I am very new to haskell and tried some methods you guys advised, > doesn't seem to work, i think i didn't do it properly, here's my code > and result, hope you can point out what's wrong. thanks! > > my code: > > myReadFile :: IO String > myReadFile = readFile "d:/hugs98/input.txt" > > theString :: String > theString = do > s <- myReadFile > putStrLn s > > > the error message i got in hugs98 > > ERROR "D:\hugs98\parser.hs":16 - Type error in explicitly typed > binding*** Term : theString > *** Type : IO () > *** Does not match : String > You can convert an IO string to a string, but the resulting string can only be given as an input to a function of type String -> IO <put your favourite type here> This approach is called "monads" and is needed because haskell is a lazy language, so order of evaluation is unspecified, while input/output usually needs a precise order of evaluation. In fact the only way (almost, but don't get confused by now) to execute non-purely-functional code (i/o for example) in haskell is to bind the name "main" to an IO operation. Now consider your "theString" function: it executes myReadFile, which is an IO operation, so theString is an IO operation itselv, and has type "IO ()", since putStrLn has this type. Note that I said "operation". If you think about types like "IO a" as "An IO operation returning the type a" everything will be more clear. Maybe someone has to suggest some simple article on monads. Bye Vincenzo _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell