In a purely-functional language, each function may produce results by using only its arguments
To access files, network or print, each function must denote this in the type (IO)
The function length :: [a] -> Int acts only on the given list to produce an integer value
The function readFile :: FilePath -> IO String acts on the given file-path, I/O and produces a string
Function arguments are evaluated as they are needed call-by-need