Many thanks to everybody who tried to set me straight on the thread about IO monad and evaluation semantics. I've begun summarizing the info, and I believe I've come up with a much better way of explaining IO; just flip the semantic perspective, and think in terms of interpretations instead of actions. Voila! Oxymoron (values that perform actions) eliminated. See the "Computation considered harmful" and "Fixing Haskell IO" articles at http://syntax.wikidot.com/blog
Naturally I would be grateful for any corrections/comments.
Thanks,
gregg