
Hi Jon,
On 15 Apr 2015, at 14:26, Jon Schneider
wrote: Perhaps I need to be more specific.
main = do a <- getLine b <- getLine
Can we say "a" absolutely always receives the first line of input and if so what makes this the case rather than "b" receiving it ? Or do things need to be slightly more complicated to achieve this ?
No, that is the case. The IO monad acts like a state monad under the hood, and getLine changes that "IO state", to one in which the next line has just been read in. So the contents of 'b' will be line that was read immediately after the line read leading to the contents of 'b'
Sorry it's just the engineer in me. I think once I've got this clear I'll be happy to move on.
I'm an engineer too - know the feeling. But, imaging a pure function f that does something with strings, and which can fail badly (unhandled runtime exception) if the string is ill-formed. Now consider main = do c <- fmap f $ getLine d <- getLine .... something involving c .... Now, if the first getLine returns an ill-formed string, laziness may mean that the second getLine occurs, and we see the program crash with a runtime error in the evaluation of c after two getLines. In effect the evaluation of f is deferred until it is needed in the 3rd line... Hope this helps!
Jon
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Andrew Butterfield School of Computer Science & Statistics Trinity College Dublin 2, Ireland