que parece ser a maneira mais matemática
linguagens funcionais são inspiradas no cálculo lambda . Nesse campo, parênteses não são usados para aplicação de função.
Eu também acho que o último estilo é muito mais claro e legível do que sem os parênteses.
A legibilidade está nos olhos de quem vê. Você não está acostumado a lê-lo. É um pouco como operadores matemáticos. Se você entende a associatividade, precisa apenas de alguns parênteses para esclarecer a estrutura de sua expressão. Muitas vezes você não precisa deles.
O curry também é um bom motivo para usar esta convenção. No haskell, você pode definir o seguinte:
add :: Int -> Int -> Int
add x y = x + y
x = add 5 6 -- x == 11
f = add 5
y = f 6 -- y == 11
z = ((add 5) 6) -- explicit parentheses; z == 11
Com parens, você pode usar duas convenções: f(5, 6)
(sem curry) ou f(5)(6)
(curry). A sintaxe haskell ajuda a se acostumar com o conceito de currying. Você ainda pode usar uma versão sem curry, mas é mais doloroso usá-la com combinadores
add' :: (Int, Int) -> Int
add' (x, y) = x + y
u = add'(5, 6) -- just like other languages
l = [1, 2, 3]
l1 = map (add 5) l -- [6, 7, 8]
l2 = map (\x -> add'(5, x)) l -- like other languages
Observe como a segunda versão obriga a registrar x como uma variável e que a subexpressão é uma função que pega um número inteiro e adiciona 5 a ele? A versão ao curry é muito mais leve, mas também é considerada por muitos como mais legível.
O programa Haskell faz uso extensivo de aplicativos e combinadores parciais como um meio de definir e compor abstrações, portanto esse não é um exemplo de brinquedo. Uma boa interface de funções será aquela em que a ordem dos parâmetros forneça um uso amigável de curry.
Outro ponto: uma função sem parâmetros deve ser chamada com f()
. Em haskell, como você manipula apenas valores imutáveis de avaliação preguiçosa, basta escrever f
e considerá-lo como um valor que precisará executar alguns cálculos quando necessário. Como sua avaliação não terá efeito colateral, não faz sentido ter uma notação diferente para a função sem parâmetros e seu valor retornado.
Existem também outras convenções para aplicação de funções:
- Lisp: (fx) - prefixo com parênteses externos
- Quarto: xf - postfix