Vstup, výstup a monády

Ciele

  1. Naučiť sa vytvárať vykonateľné programy.
  2. Oboznámiť sa s operáciami pre vstup a výstup.

Postup

Krok 1: Spustiteľný program

Spustiteľný program v jazyku Haskell musí obsahovať funkciu main :: IO ().

Úloha 1.1

Vytvorte nový súbor hello.hs, obsahujúci funkciu main:

main :: IO ()
main = putStrLn "Hello world!"

Skompilujte tento program:

ghc hello.hs

Krok 2: Vstup a výstup

Úloha 2.1

Upravte program hello.hs tak, aby sa po spustení opýtal na meno používateľa a na mesto, kde žije. Následne vypíše pozdrav v formáte: „Hello, <meno> from <mesto>!“.

Poznámka

Použite funkcie getLine a putStrLn. Použite let na skonštruovanie reťazca s pozdravom pred jeho vypísaním.

Úloha 2.2

Ak ste kód napísali pomocou do-notácie, skúste ho prepísať pomocou operátora >>=. Alebo naopak, ak ste použili operátor >>=, prepíšte ho pomocou do-notácie.

Krok 3: Validácia vstupu

Úloha 3.1

Implementujte funkciu getInt :: IO Int, ktorá sa opýta používateľa na celé číslo a vráti ho. Ak používateľ zadá neplatný vstup, program sa opýta znova. Použite funkciu readMaybe z modulu Text.Read na konverziu reťazca na číslo.

Krok 4: Dotazník

Úloha 4.1

Nech máme definovaný zoznam otázok:

questions :: [String]
questions =
    [ "What is your name?"
    , "What is your favourite language?"
    , "What would you like to build?"
    ]

Definujte funkcie ask a askAll. Prvá sa bude pýtať zadanú otázku a vráti odpoveď. Druhá sa postupne opýta všetky otázky zo zoznamu a vráti zoznam odpovedí.

ask :: String -> IO String
askAll :: [String] -> IO [String]

Poznámka

Skúste implementovať funkciu askAll pomocou rekurzie aj pomocou funkcie mapM.

Krok 5: Práca so súbormi

Úloha 5.1

Upravte program na zobrazovanie histogramu tak, aby čítal zoznam čísel zo súboru, názov ktorého bude zadaný ako argument príkazového riadku.

Poznámka

Použite funkcie pre prácu so súbormi a funkciu getArgs. Potrebujete tiež pridať do kódu:

import System.Environment

Krok 6: Balík a závislosti

Úloha 6.1

Vytvorte aplikáciu pre hádanie mysleného čísla: Nech počítač si myslí číslo a používateľ háda myslené číslo. Počítač nech po nesprávnom odhade povie, či je myslené číslo väčšie alebo menšie ako hádané.

Aby sme mohli používať doplňujúcu knižnicu random, vytvoríme nový projekt. V novom adresári guess spustíte príkaz pre vytvorenie projektu:

cabal init

Na všetky otázky stačí dať predvolenú odpoveď.

V súbore guess.cabal pridajte závislosť na balík random:

    -- Other library packages from which modules are imported.
    build-depends:    base ^>=4.20.2.0,
                      random

Môžete použiť pomocnú funkciu randNumber na generovanie náhodného čísla na základe špecifikovaného intervalu a odovzdaného generátora:

module Main where
import System.Random

main :: IO ()
main = do
    number <- randNumber 1 10
    putStrLn ("Hello, " ++ show number ++ "!")


randNumber :: Int -> Int -> IO Int
randNumber a b = getStdGen >>= \gen -> return (fst (randomR (a, b) gen))

Teraz na spúšťanie programu vám stačí použiť príkaz:

cabal run

Zdroje

  1. A Gentle Introduction to Haskell: Input/Output
  2. HaskellWiki: Introduction to IO