Obsah
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: |
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: |
Pro řezy zahrnující infixový/prefixový operátor -
platí zvláštní pravidla.
| |
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.