Funções
No cerne da programação funcional estão as funções.
Vejamos então como algumas funções bem simples, como uma função que soma os números de x
a y
, podem ser definidas.
A título de comparação, vejamos primeiro a função em linguagem C.
int soma(int x, int y) {
int total = 0;
for (int i = x; i <= y; i++)
total = total + i;
return total;
}
Em Haskell, temos diversas opções para obter o mesmo resultado, por exemplo, usando uma função recursiva, cuja definição deve ser clara para você, mesmo se esta for a primeira vez que vê um código em Haskell.
somaDeAte x y = if x < y
then x + somaDeAte (x+1) y
else x
Observe que a sintaxe do uso das funções, contudo, é atípica. Enquanto a função em C é invocada como soma(1,10);
, em Haskell, usa-se o nome da função, seguido dos parâmetros, com espaço os separando, isto é:2
> somaDeAte 1 10
55
A definição de funções em Haskell é feita pela especificação de uma ou mais equações. Na forma mais comum de definição, do lado esquerdo da equação temos o nome da função, iniciado sempre uma letra minúscula, e seguido por um ou mais parâmetros formais, todos iniciados também por letras minúsculas. A convenção é que funções e parâmetros sejam nomeados usando Camel Casing. Já do lado direito temos definição do cálculo do resultado.
nomeDaFunção [par1 [par2 [par2]]] = definição
Por exemplo, consideremos uma função que soma dois números.
Em Haskell, ela é definida simplesmente como soma x y = x + y
e usada como soma 3 5
.
De forma semelhante, uma função que multiplica três números é definida como mult3 x y z = x * y * z
e invocada como a seguir.
> mult3 2 3 4
24
Exercício: Soma
- Defina a função soma e use-a, de acordo com a imagem.1
Como outro exemplo, definamos uma função que retorna o sucessor de um inteiro como sucessor x = x + 1
.
Com estas funções podemos, inclusive, compor funções no melhor estilo \(g(f(x))\), por exemplo:
> sucessor (soma 3 4)
8
> sucessor (sucessor (sucessor 4))
7
Exercício: Composição
- Defina uma função que multiplique 3 números, isto é, dados \(x\), \(y\) e \(z\), calcule \(x*y*z\).
- Calcule \((1 + (3 * 2 * 3)) + (5 * 3 * 2)\) usando as funções de soma e multiplicação definidas.
Resolução
Defina as funções
soma x y = x + y
mult3 x y z = x * y * z
Invoque soma (soma 1 (mult3 3 2 3)) (mult3 5 3 2)
. Observe que os parênteses são necessários para delimitar os parâmetros de cada uma das invocações.
Exercício: média de 3 números
- Defina uma função que calcule a média de 3 números
Resolução
media x y z = (x + y + z)/3
Exercício: área das figuras
- Defina uma função o cálculo da área de cada figura geométrica.
Resolução
areaQuad a = a * a
areaRet a b = a * b
areaCirc r = pi * r * r
areaTri a h = (a * h )/ 2
areaTra a b h = (a + b)/2 * h