4.3. Řezy operátorů

Obsah

4.3.1. Deklarace druhu operátoru

Vzhledem k tomu, že infixové operátory jsou vlastně také funkce, má rovněž smysl je aplikovat pouze částečně. V Haskellu se částečná aplikace operátoru nazývá řezem. Například:

(x+)  = \y -> x+y  
(+y)  = \x -> x+y  
(+)  = \x y -> x+y  


Poznámka:
Poznámka:
Závorky jsou povinné.

Poslední výše uvedený tvar řezu v podstatě konvertuje infixový operátor na ekvivalentní funkční hodnotu a hodí se tehdy, pokud předáváme infixový operátor jako argument funkce, jako např. v map (+) [1,2,3] (můžete si ověřit, že tímto dostáváme seznam funkcí!). Nutný je také tehdy, pokud uvádíme signaturu typu funkce, jako v příkladech funkcí (++) a (.) uvedených dříve.

Nyní již víme, že výše uvedená funkce add je vlastně (+) a inc je zase (+1)! Dokonce postačí pouze následující definice:

inc                    = (+ 1)
add                    = (+)

Infixový operátor můžeme konvertovat na funkční hodnotue, ale je to možné také naopak? Ano - pouze uzavřeme identifikátor funkce mezi obrácené apostrofy. Například x `add` y je totéž jako add x y. (Pozorně si všimněte toho, že add je uzavřeno ve zpětných, ne obyčejných apostrofech, které se používají v zápisu znakových literálů; např. 'f' je znak, zatímco `f` je infixový operátor. Naštěstí většina ASII termínálů mezi těmito znaky rozlišuje mnohem lépe než písmo použité v tištěném textu.) Některé funkce jsou v tomto tvaru mnohem čitelnější. Příkladem je předdefinovaný operátor příslušnosti do seznamu elem; výraz x `elem` xs se dá intuitivně číst jako „x je prvkem xs.“


Poznámka:
Poznámka:
Pro řezy zahrnující infixový/prefixový operátor - platí zvláštní pravidla.

Průvodce studiem V tomto místě můžete být zmateni tím, kolika možnostmi můžeme definovat funkci. Důvody pro poskytnutí těchto mechanismů jsou částečně historické, částečně odrážejí snahu o konzistenci (např. při zpracování infixových a obyčejných funkcí).

4.3.1. Deklarace druhu operátoru

Druh operátoru lze deklarovat pro libovolný infixový operátor nebo konstruktor (včetně těch, které jsou vytvořeny z normálních identifikátorů jako `elem`). (Deklarace druhu operátoru se musí vyskytovat pouze na úplném začátku modulu v Haskellu, jak bude uvedeno později.) Tato deklarace specifikuje úroveň priority od 0 do 9 (kde 9 znamená nejvyšší prioritu; pro normální aplikaci funkce se používá úroveň 10) a levou, pravou či žádnou asociativitu. Například deklarace druhu operátoru ++ a . jsou:

infixr 5 ++
infixr 9 .

Oba operátory jsou zprava asociativní, první z nich má prioritu 5 a druhý 9. Levá asociativita se specifikuje pomocí infixl, žádná asociativita pomocí infix. V jedné deklaraci lze rovněž uvést více operátorů současně. Není-li pro konkrétní operátor k dispozici žádná deklarace jeho druhu, vezme se implicitně infixl 9.