Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Typy IIIProč typové třídy?
Z předchozích lekcí o typech víme, že typ je krabička obsahující hodnoty se společnými vlastnostmi. Například
Jakého typu je funkce
Jak tedy Krabičky krabičekZnázornění typové třídy Eq
Tak toto je krabička (==) :: Eq a => a -> a -> BoolZnamená to funkce (==) může dostat dva argumenty jakéhokoli typu, který je z typové třídy Eq .
Jakého typu je funkce Znázornění typové třídy Num
Typ funkce (+) :: Num a => a -> a -> aTřída Num zahrnuje mimo jiné i podtřídy Integral , což jsou všechna celá čísla, a Floating , což jsou všechna desetinná čísla. Nám bude stačit, když budeme znát krabičku Num .
Ještě zbývá zmínit krabičku
Operátory (<) :: Ord a => a -> a -> Bool Vkládáme krabičky do krabičekNyní už víme, že existují funkce, které si jako argumenty berou "cokoli, co se dá testovat na rovnost". Například funkce zipWith (==) :: Eq a => [a] -> [a] -> [Bool]si bere dva seznamy čehokoli porovnatelného a vrací seznam pravdivostních hodnot. My bychom chtěli tuto funkci aplikovat například na dva seznamy typu [Nat] , což jsou přirozená čísla, která jsme si definovali dříve. Jsou definována následovně:
data Nat = Zero | Succ NatChtěli bychom, aby bylo možné provést následující vyhodnocení výrazu: zipWith (==) [Zero, Succ Zero] [Zero, Succ (Succ Zero)] ~>* [True, False]Takové vyhodnocení ale není možné, protože Nat nepatří do třídy Eq . Co s tím? Vložíme typ Nat do třídy Eq . Provedeme to tak, že zadefinujeme rovnost dvou hodnot typu Nat .
Kdy se dvě hodnoty typu
A přesně tak to zapíšeme. Nejprve musíme zmínit, co vlastně děláme. Vkládáme typ instance Eq NatDoplníme definici rovnosti dvou prvků typu Nat podle výše uvedeného rozboru.
instance Eq Nat where Zero == Zero = True Succ x == Succ y = x == y _ == _ = Falsekde v klauzuli Succ x == Succ y = x == y je == na pravé straně rekurzivně volaná ta samá funkce, neboť x i y jsou opět typu Nat , čili můžou být pouze ve tvaru Zero nebo Succ x .
A to je celé. Nyní můžeme hodnoty typu
Aby mohl být typ v typové třídě
|