IO behaves oddly if used nested

blaat blaat l4t3r at
Wed Oct 1 23:33:17 EDT 2003

Hi, the interact remark triggered me to post this remark on nested use of 
IO. (I posted something similar some month ago on haskell-cafe/I read the 
haskell-archives ones so often)

What about this program:

  main :: IO ()
  main = putStr (show (putStr "Hello World!"))

Am I the only one who feels that there is some conceptual _wrongness_ about 
Hugs responding with <<IO action>>?

Another question with a trivial answer, what is the result of:

  main :: IO (IO ())
  main = return (putStr "Hello World!")

Clearly it also shows the relation between IO and chosen evaluation 


Some other random thoughts:....

Hmm,... there was also some question on the use of existential types, what 
about the following one (might be used to implement IO trivially in a 
_pure*_ manner! *with respect to rewrite strategy):

  data Nomad a = Return a | forall b . Bind (Nomad b) (b -> Nomad a)

I would like to see Haskell extended with subtyping on algebraic datatypes 
(or is this implemented already?) Some of my programs would really benefit 
from such a feature.

I am a teacher, I use haskell to test random ideas from combinatorics, 
SAT/EDA verification, control theory, real-time processes, and 
compiler/verification-language implementation. In short, I use Haskell as a 
vehicle to test short algorithms.

Oh yeah, I propose to move the link on the Haskell site on "Monads explained 
by the Catholic Church" from the "Humor" section to the "Learning Haskell" 
section since they seem to be the only ones who actually clearly understand 
what is up with monadic IO. ;-p (actually, that is a dead-serious 

Hmm, long post, cheers again,

The new MSN 8: smart spam protection and 2 months FREE*

More information about the Haskell mailing list