Vstup a výstup

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.

Práce se soubory

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.

Systémové programování

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.

Příklady

Odstranění souboru

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."

Připsání textu do souboru

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

← IB016