Reading, writing, and handling resources
Although it's a common joke that because Haskell is a pure language, we couldn't observe its effects, Haskell actually has very powerful and sophisticated facilities for interacting with the outside world. Besides reading and writing to files and network sockets, I/O affiliates to managing resources that provide for input and output.
In this section, we will first point out laziness in Haskell I/O, doing networking with low-level sockets, and consider managing handles and resources.
Traps of lazy I/O
Lazy I/O allows pure functions to be interleaved with I/O actions arbitrarily. It is important to know when an I/O action defers its action part for later. To demonstrate how easy it is to fall prey to lazy I/O, consider this innocent-looking file manipulation procedure:
-- file: readwrite.hs main = do writeFile "file.txt" "old" old <- readFile "file.txt" writeFile "file.txt" "new" putStrLn old
However, running this code produces an error...