[Haskell-cafe] Execution order in IO
Andrew.Butterfield at scss.tcd.ie
Wed Apr 15 13:51:21 UTC 2015
> On 15 Apr 2015, at 14:26, Jon Schneider <haskell at jschneider.net> 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.
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!
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
School of Computer Science & Statistics
Dublin 2, Ireland
More information about the Haskell-Cafe