Pro vstup a výstup se v Haskellu využívají monády, které umožňují oddělit čistý kód od kódu s vedlejšími efekty. Většina funkcí z modulu System.IO proto využívá datové typy monády IO
, jež označuje, že daný typ pracuje s daty z okolního světa. Existuje možnost, jak z této monády uniknout, ale zásadně se to nedoporučuje, protože pak může docházet k nestabilitám v programu.
Zpracování souborů se děje standardně líně, takže se nemusíme bát, že např. funkce hGetContents
načte nejprve obsah celého souboru, protože se začne načítat až na požádání. Kdybychom potřebovali striktní chování, máme k dispozici modul strict. Práci nám usnadňují funkce z modulu Control.Monad. Sekvenci příkazů můžeme uvodit pomocí klíčového slova do
, ve kterém lze uvádět klauzule let
(bez části in
). Toto téma je výborně popsáno v sedmé kapitole knihy Real World Haskell.
Pro práci se soubory a adresáři slouží modul System.Directory. Kromě „obyčejných“ souborů a adresářů můžeme pracovat i s dočasnými, do kterých si můžeme ukládat např. mezivýsledky zpracování dat. Argumenty programu zjistíme pomocí funkce getArgs
a název programu pomocí funkce getProgName
z modulu System.Environment. Na webu Leifa Frenzela je ukázáno několik pokročilejších možností použití, spolu s modulem System.Console.GetOpt. K dispozici je i pokročilejší knihovna pro zpracování argumentů cmdlib, kterou napsal Petr Ročkai.
import System.IO
import System.Directory
main :: IO ()
main = do
putStr "Delete file: "
hFlush stdout
file <- getLine
exist <- doesFileExist file
if exist
then removeFile file
else putStrLn "File not found."
import System.IO
import System.Environment
import Control.Monad
main :: IO ()
main = do
args <- getArgs
when (null args) (getProgName >>= (\x -> error $ "Usage: \"" ++ x ++ " <filename>\""))
let filename = unwords args
h <- openFile filename AppendMode
putStrLn "Insert text and end it with Ctrl + D:"
getContents >>= hPutStr h
hClose h