3 ms·
A good dive into of why lazy IO is a problem are these Oleg slides: https://okmij.org/ftp/Haskell/Iteratee/IterateeIO-talk-notes.pdf https://okmij.org/ftp/Haske
by code_biologist 4y ago
A good dive into of why lazy IO is a problem are these Oleg slides: https://okmij.org/ftp/Haskell/Iteratee/IterateeIO-talk-notes.pdf https://okmij.org/ftp/Haskell/Iteratee/IterateeIO-talk-notes...
My favorite slide:
I can talk a lot how disturbingly, distressingly wrong lazy IO is
theoretically, how it breaks all equational reasoning. Lazy IO entails
either incorrect results or poor optimizations. But I won’t talk about
theory. I stay on practical issues like resource management. We don’t
know when a handle will be closed and the corresponding file
descriptor, locks and other resources are disposed. We don’t know
exactly when and in which part of the code the lazy stream is fully
read: one can’t easily predict the evaluation order in a non-strict
language. If the stream is not fully read, we have to rely on unreliable
finalizers to close the handle. Running out of file handles or database
connections is the routine problem with Lazy IO. Lazy IO makes error
reporting impossible: any IO error counts as mere EOF.
It becomes worse when we read from sockets or pipes. We have to be
careful orchestrating reading and writing blocks to maintain
handshaking and avoid deadlocks. We have to be careful to drain the
pipe even if the processing finished before all input is consumed. Such
precision of IO actions is impossible with lazy IO. It is not possible to
mix Lazy IO with IO control, necessary in processing several HTTP
requests on the same incoming connection, with select in-between.
I have personally encountered all these problems. Leaking resources is
an especially egregious and persistent problem. All the above
problems frequently come up on Haskell mailing lists.