On Sun, 24 Nov 2002 09:05:17 -0900 "Lu Mudong" <mudong@hotmail.com> 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