
On Wed, 2005-07-20 at 00:21 +0200, yin wrote:
Dinh Tien Tuan Anh wrote:
Hi, Could anyone explain for me why its not possible to return a primitive type (such as Integer, String) while doing some IO actions ?
e.g: foo :: IO() -> String
What does it have to do with "lazy evalution" paradigm ?
In short, to not break functional aproach. Non-IO functions can't call IO functions, because IO functions are evaluated every time you call them.
I prefer to say it another way. I think you asking for a function like this: f :: IO a -> a If so, with this you could write: someChar :: Handle -> Char someChar handle = f (hGetChar handle) where hGetChar :: Handle -> IO Char and Handle represents the interface to a file. This is a big problem for a purely functional language, because it means someChar is not a function! Given the same Handle argument, successive calls to someChar might return different results. Functions, by definition, are not allowed to have this kind of behaviour. Therefore f is not allowed. Cheers, Bernie.