| Safe Haskell | None |
|---|---|
| Language | Haskell98 |
System.IO.Lazy
Description
Caution:
- Although this module calls
interleaveIOfor you, it cannot take the responsibility from you. Using this module is still as unsafe as callinginterleaveIOmanually. Thus we recommend to wrap the lazy I/O monad into a customnewtypewith a restricted set of operations which is considered safe for interleaving I/O actions. - Operations like
hCloseare usually not safe within this monad, since they will only get executed, if their result is consumed. Since this result is often()this is quite unusual. It will also often be the case, that not the complete output is read, and thus the closing action is never reached. It is certainly best to call a closing action after you wrote the complete result of the lazy I/O monad somewhere return a :: LazyIO ais very different fromliftIO (return a) :: LazyIO a. The first one does not trigger previous IO actions, whereas the second one does.- We advise to lift strict IO functions into the lazy IO monad.
Lifting a function like
readFilemay lead to unintended interleaving.
Use it like
import qualified System.IO.Lazy as LazyIO
LazyIO.run $
do liftIO $ putStr "enter first line:"
x <- liftIO getLine
liftIO $ putStr "enter second line:"
y <- liftIO getLine
return xBecause only the first entered line is needed,
only the first prompt and the first getLine is executed.