
On Jan 23, 2010, at 16:08 , Daniel Fischer wrote:
Am Samstag 23 Januar 2010 21:31:47 schrieb Adrian Adshead:
I have two questions to try and clarify my understanding.
1) Is it possible to have a function with an IO Action as an input parameter (and not just ignore the parameter) and have a non-IO return value? (ie is f :: IO a -> b possible without ignoring the IO a)
Excluding unsafePerformIO, only in a very weak sense.
And, while you could do the dance to make unsafePerformIO available and use it, the aggressive optimizations the compiler makes on pure code can lead to extremely unexpected results.
2) Is it possible to have a function which evaluates any IO Action within the body and have a non-IO return value? (ie is f :: a -> b possible while evaluating any IO Action within the body.)
Assuming by evaluating you mean executing and not
(return 5 >> return 6) ~> IO (\s -> (s,6))
, no, that's not possible.
Again, barring unsafePerformIO, and that will bite you if you use it without knowing exactly what you're doing and why and *forcing* the compiler to agree with you. (As it turns out, you can often figure out the implementation details of your chosen compiler's IO and force the issue. But any code that do so *is* reimplementing unsafePerformIO, and you will pay dearly.) -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH