However, I would move IO further to the front. For any "real life" programming, IO is essential...
I am currently teaching a Functional Programming lecture (notes in German: http://www.informatik.uni-leipzig.de/~joe/edu/ws00/praxis/skript/) and I also used this approach: use the do-notation intuitively (for text IO and graphics, using SOE book), and explain monads later (with parser combinators and interpreters). This could be driven to the extreme: not only hide the word "monad", but also "functional". The title would be "Imperative programming in Haskell" (as S. Peyton Jones says in Tackling the Awkward Squad: "Haskell is the world's finest imperative programming language"). The students would start writing do-notated programs in the IO monad, starting with putStrLn "Hello World"; and gradually the emphasis is shifted from sequencing (the "semicolon") to "what can we do on the righthand side of let x = ... ", thus introducing functional programming. Not sure if this is really a good idea, though... -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 --