
Excerpts from Ken Overton's message of Sat May 08 12:20:12 -0400 2010:
Thanks; I guess my 'problem' is that I naturally gravitate to a function that returns *the result of the interaction* rather than IO, but that seems impossible anywhere IO is used.
That's correct; there's no (normal) way to write a function IO a -> a.
So looking at the 'real' interact function, I guess the Haskell way is to pass in my function that acts on the data that was read. I guess that makes sense as then I can separate all my 'action' code from IO code. Is that a reasonable understanding?
That is also correct. Notice the types inside your do-block: do rsp <- getLine getLine is of type IO String, but rsp is of type String! As long as we're in a do-block (which "keeps" us in the IO monad), we can temporarily extract the real value without IO to pass to a pure function. Cheers, Edward