The IO approach
In this section, we will see how Haskell overcomes the challenges of performing I/O, by means of an approach based on a special type called IO. The solution to the I/O problem in Haskell is a conceptual one. We split I/O into two parts. First, we make a description of what I/O actions should be performed, and in what order. This is akin to, for example, writing a recipe for chocolate mousse. The second part is to perform the actions described. This corresponds to making chocolate mousse by following the recipe.
Describing I/O
A description can be thought of as inert data; it just is and does not do anything itself. For example, a recipe is usually just text in a cookbook. We have seen an example of this already in the Expr
datatype to describe arithmetic expressions:
data Expr = Lit Int | Add Expr Expr
When we write Add (Lit 5) (Lit 3)
, we just construct a data structure. No computation happens, and we do not get the value 8
.
We have already constructed...