[Haskell-cafe] IO Monad

Bernard Pope bjpop at cs.mu.OZ.AU
Wed Jul 20 02:32:38 EDT 2005

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. 


More information about the Haskell-Cafe mailing list