Haskell Hero

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

Základní znalosti

Obecně

Následující řádky neberte jako nutnost k našprtání. Spíš je to jen přehled základních věcí, se kterými další lekce počítají. Pro první přečtení to doporučuju jen tak proletět a pak se sem v případě potřeby vrátit.

Case sensitive

Haskellu na velikosti záleží. Je velký rozdíl, jestli Hugsu napíšeme mojeFunkce nebo MojefunKce.

  • Výběr věcí, které se píší se začátečním malým písmenem:
    • název funkce mojeFunkce, f, fact
    • argumenty funkce x, y, vyska, sirka
    • označení polymorfních typů a, b, c
  • Výběr věcí, které se píší se začátečním velkým písmenem:
    • název typu Integer, Char, String
    • pravdivostní hodnoty True, False

Rozlišování velkých a malých písmen není pouze nějaká domluva programátorů, ale Hugs se podle nich opravdu řídí. Pokud si necháme vyhodnotit výraz

False
Hugs si výraz False přebere jako pravdivostní hodnotu, zjistí, že ta už je sama o sobě nezjednodušitelný výraz a dostaneme opět False jako výsledek.

Pokud bychom napsali False s malým počátečním písmenem, čili

false
Hugs nám oznámí, že funkci/proměnnou false nezná.

Datové typy a struktury

Datový typ je souhrnné označení hodnot se stejnými vlastnostmi. Více si o typech povíme v kapitole Typy.

V naší učebnici budeme pracovat s následujícími datovými typy a strukturami:

  • Celá čísla: 8, 5, -3, 0
  • Desetinná čísla: 8.5, -5.8, 3.0
  • Pravdivostní hodnoty: True, False
  • Znaky: 'c', 'Ž', '&' (uzavíráme do rovných apostrofů)
  • Řetězce:
    "Haskell"
    "@&!#P961"
    "123987"          -- uzavíráme do rovných uvozovek
    
  • Uspořádané dvojice, trojice, ...:
    (1,2)
    ('a',8.4, "PraVdA")
    ("Haskell",False,4,'@')
      -- uzavíráme do kulatých závorek, oddělujeme čárkami
    
    Uspořádané dvojice se tvoří operátorem (,), trojice operátorem (,,), čtveřice operátorem (,,,) atd.
    (,) 1 2             ~>  (1,2)
    (,,) True 'v' 10.5  ~>  (True, 'v', 10.5)
    
  • Seznamy:
    [1,2,3,4,5]
    ['f','&','Q','!']
    [("Honza",15),("Marek",28),("Jana",32)]
    [[7,9,4],[1],[8,56,12,14],[]]
      -- uzavíráme do hranatých závorek, oddělujeme čárkami
    

Arita funkce

Arita je vlastnost funkce, která udává, kolik argumentů funkce potřebuje ke svému plnému vyhodnocení.

  • Funkce arity jedna (unární funkce) potřebuje pouze jeden argument, aby se plně vyhodnotila. Příkladem unární funkce je například funkce odd, která zjišťuje, zda je číslo dané jako argument liché.
  • Funkce arity dvě (binární) je například funkce (+), která sečte dvě čísla a vrátí jejich výsledek.
  • Stejně tak existují funkce arity tři (ternární), které k plnému vyhodnocení potřebují tři argumenty.
  • A pak jsou zde také nulární funkce, což můžou být buď konstanty, neboli nezjednodušitelné výrazy, které už jsou plně vyhodnocené, nebo zjednodušitelné výrazy, které se vyhodnotí pokaždé na stejnou hodnotu.

V krabičkovém modelu označuje arita funkce počet děr na vrchní stěně krabičky.


Unární funkce f, binární funkce g a ternární funkce h

if-then-else

V Haskellu máme konstrukci
if podminka then splneno else nesplneno
kde
  • podminka je výraz, který se vyhodnotí na pravdivostní hodnotu True nebo False
  • splneno je výraz, na který se výraz if-then-else vyhodnotí v případě splnění podmínky
  • nesplneno je výraz, na který se výraz if-then-else vyhodnotí v případě nesplnění podmínky

Několik důležitých vlastností if-then-else výrazů:
  • V Haskellu neexistuje konstrukce
    if podminka then splneno
    
    Ve funkcionálním programování požadujeme, aby byl každý výraz vyhodnotitelný. Pokud bychom neuvedli, jak se má výraz vyhodnotit v případě nesplnění podmínky, výpočet by neměl jak pokračovat.
  • Výrazy splneno a nesplneno musí být oba stejného typu. Pokud například do části splneno napíšeme číslo, musí být číslo i v části nesplneno.

Příklad:

Zkonstruujte výraz, který zjistí, zda je číslo 5 sudé číslo. Pokud ano, ať se celý výraz vyhodnotí na písmeno 'A', pokud ne, ať se výraz vyhodnotí na písmeno 'N'.


Jako podmínku zvolíme tedy výraz even 5, jako výraz při splnění podmínky napíšeme 'A' a jako výraz při nesplnění napíšeme 'N'. Výsledný výraz tedy bude vypadat následovně:

if even 5 then 'A' else 'N'
což se vyhodnotí následovně:
   if even 5 then 'A' else 'N'
~> if False then 'A' else 'N'
~> 'N'

Komentáře

Do zdrojového kódu si můžeme psát i naše poznámky, které bude překladač ignorovat. Zakomentování kódu provedeme napsáním dvou pomlček --. Vše od těchto pomlček až do konce řádku se nebude překládat jako kód.

kód programu -- komentář, který bude při překladu ignorován
další překládaný kód programu

Mimo psaní poznámek můžeme komentáře použít i pro zamezení překladu kusu kódu.

f 0 = 0
-- f 1 = 1   tento řádek jakoby tu nebyl
f x = x + 1
Toto použití komentářů je obzvláště užitečné při ladění programu. Pokud chceme, aby se nějaký kus kódu nepřekládal, ale nevíme, zda jej nebudeme v budoucnu ještě potřebovat, místo smazání jej pouze zakomentujeme. Jeho znovuzpřístupnění se provede pouhým odstraněním pomlček.

Pokud potřebujeme vytvořit komentář přes více řádků, uzavřeme jej mezi znaky {- a -}.

překládaný kód programu {- komentář komentář
pořád komentář
ještě pořád komentář
-}
další kód programu