Haskell Hero

Interaktivní učebnice pro začínající Haskellisty

Vstup a výstup II

>>, >>=, return

V lekci Vstup a výstup I jsme si ukázali konstrukci do.

vypis = do putStrLn "abc"
           putStrLn "def"
           putStrLn "ghi"
čili vypiš "abc", pak vypiš "def" a nakonec "ghi". Tuto posloupnost příkazů můžeme zapsat pomocí operátoru >>. Vyhodnocení výrazu akce1 >> akce2 >> akce3 proběhne tak, že se nejdřív provede akce1, následně akce2 a nakonec akce3. V našem příkladu tedy:
putStrLn "abc"  >>  putStrLn "def"  >>  putStrLn "ghi"

V předchozím případě proběhly akce nezávisle na sobě. My ale budeme chtít například načíst hodnotu od uživatele a s ní pak dále pracovat. Čili předat vnitřní hodnotu jedné akce akci druhé. To provedeme operátorem >>=. Výraz, který načte hodnotu od uživatele a následně ji vypíše, bude vypadat následovně:

getLine  >>=  putStr
Čili načti vstup od uživatele, tuto hodnotu předej dál a aplikuj na ni funkci putStr.

S předanou hodnotou můžeme udělat i více akcí. Stačí si uvědomit, že předchozí zápis je jen do pointfree převedený výraz

getLine  >>=  \s -> putStr s
Nic nám tedy nebrání vypsat předanou hodnotu dvakrát za sebou:
getLine  >>=  ( \s -> putStrLn s  >> putStrLn s )
Čili načti vstup, jehož hodnotu předej funkci, která svůj argument dvakrát vypíše.

Akce getLine je typu IO String, která slouží k načtení řetězce. Načtený řetězec se stává vnitřní hodnotou akce getLine, která je dostupná jen operátoru (>>=). Pokud bychom chtěli vypsat například výsledek sčítání 3 + 5, musíme jej nejdříve převést na String (funkcí show). To ale nestačí. Operátor >>= musí mít první argument typu IO a. Takže musíme z hodnoty typu String udělat hodnotu typu IO String. A právě tohle dělá funkce return :: a -> IO a (její typ je ještě obecnější, nám bude stačit tento).

return (show (3 + 5))  >>=  putStr