I/O as a first class citizen
The IO monad provides the context in which the side effects may occur, and it also allows us to decouple pure code from the I/O code. In this way, side effects are isolated and made explicit. Let's explore the ways in which I/O participates as a first-class citizen of the language:
import System.IO import Control.Monad import Control.Applicative main = do h <- openFile "jabberwocky.txt" ReadMode line <- hGetLine h putStrLn . show . words $ line hClose h
This code looks imperative in style: it seems as if we are assigning values to the h
and line
objects, reading from a file, and then leaving side effects with the putStrLn
function.
The openFile
and hGetLine
functions are I/O actions that return a file handle and string, respectively:
openFile :: FilePath -> IOMode -> IO Handle hGetLine :: Handle -> IO String
The hClose
and putStrLn
functions are I/O actions that return nothing in particular:
putStrLn :: String...