[Haskell-cafe] Looking for feedback on my beginner's Haskell resource

Joachim Durchholz jo at durchholz.org
Tue Nov 6 06:42:15 UTC 2018

Am 05.11.18 um 23:27 schrieb Brandon Allbery:
> No state is modified, at least in ghc's implementation of IO.

That's what I'd expect.

> IO does carry "state" around, but never modifies it; it exists solely
> to establish a data dependency (passed to and returned from all IO
> actions; think s -> (a, s),
In Haskell, a data dependency can impose constraints on evaluation 
order, but it isn't always linear: which subexpression is evaluated 
first depends on what a pattern match requests (at least in Haskell: 
Haskell's strict operation is the pattern match).

The ordering constraint becomes linear if each function calls just a 
single other function. I'm not sure that that's what happens with IO; 
input operations must allow choices and loops, making me wonder how 
linearity is established. It also makes me wonder how an IO expression 
would look like if fully evaluated; is it an infinite data structure, 
made useful only through Haskell's laziness, or is it something that's 
happening in the runtime?

The other thing that's confusing me is that I don't see anything that 
starts the IO processing. There's no pattern match that triggers an 
Not that this would explain much: If IO were constructed in a way that a 
pattern match starts IO execution, there'd still be the question what 
starts this first pattern match.

Then there's the open question what happens if a program has two IO 
expressions. How does the runtime know which one to execute?

Forgive me for my basic questions; I have tried to understand Haskell, 
but I never got the opportunity to really use it so I cannot easily test 
my hypotheses.


More information about the Haskell-Cafe mailing list