Operadores
Operadores são apenas funções, mas funções com algumas particularidades. Em primeiro lugar, operadores são funções binárias, isto é, que recebem exatamente dois parâmetros. Em segundo lugar, o nome do operador é escrito apenas com símbolos (sem letras e números). Em terceiro, operadores são naturalmente infixos, isto é, são colocados entre os dois operandos em sua invocação.
Veja o seguinte exemplo, em que se declara o operador ******
que é essencialmente igual ao operador +
.
Observe que o protótipo é especificado com o operador entre parênteses, mas o a definição da equação é feita usando a notação infixa.
(******) :: Int -> Int -> Int
x ****** y = x + y
A invocação do operador é feita normalmente.
> 1 ****** 3
4
> (******) 1 3
4
Prioridades
Quando uma expressão tem vários operadores e funções, estas são executadas na ordem e suas prioridades, a não ser que parênteses sejam usados para forçar uma ordem de avaliação.
> 1 + 2 * 3
7
> (1+2)*3
9
As ordens de prioridade são dadas pela definição dos operadores e podem ser verificadas usando o comando :i
do GHCi.
No resultado da execução trecho adiante, abreviado, identificamos que os operadores de adição, multiplicação e exponenciação tem, respectivamente, prioridades 6, 7 e 8.
ghci> :i (+)
...
infixl 6 +
ghci> :i (*)
...
infixl 7 *
ghci> :i (^)
...
infixr 8 ^
Observe que funções normais tem prioridade maior que a dos operadores, independente de como são definidas. No exemplo a seguir, a função double nada mais é que uma soma, mas ainda assim é avaliada primeiro na quando imersa em uma expressão contendo operadores.
> double x = x + x
> 3 * double 2 + 1
13