Expressões, avaliação e tipos em Haskell
Avaliar expressões por substituição, definir funções por equações e ler tipos predefinidos.
Avaliar por substituição
- Uma equação define um resultado por substituição. Com
dobra x = 2*x,dobra (3+1)reduz a2*(3+1)e dá8. xnomeia o argumento dessa aplicação; não é uma posição de memória a atualizar.- A aplicação tem prioridade sobre operadores e associa à esquerda:
dobra 3 + 1dá7,f x yé(f x) y. Um número negativo como argumento escreve-sef (-3). wheredá nomes a cálculos de uma equação;let ... in ...dá nomes dentro de uma expressão. A indentação delimita os blocos.
Padrões e guardas
somaQuadrados :: [Int] -> Int
somaQuadrados [] = 0
somaQuadrados (x:xs) = x^2 + somaQuadrados xs
-- somaQuadrados [1,2,3] = 1 + 4 + 9 + 0 = 14
[]é a lista vazia;x:xssepara cabeça e cauda. Os padrões tentam-se de cima para baixo; um padrão geral antes do caso base esconde-o._aceita qualquer valor sem o ligar; não pode aparecer no corpo.- As guardas escolhem a primeira condição verdadeira.
otherwiseéTruee fica no fim. - Usa padrões para a forma dos dados e guardas para condições sobre valores. O
ifprecisa deelse, e ambos os ramos têm o mesmo tipo.
Tipos, divisão e domínio
| Tipo | Valores |
|---|---|
Int, Integer | Inteiros de precisão fixa e arbitrária. |
Float, Double | Aproximações em vírgula flutuante. |
Bool, Char | True/False e carateres como 'a'. |
String | Sinónimo de [Char]; "ola" é uma lista. |
[a], (a,b) | Lista homogénea; par que pode juntar tipos. |
() | Valor unitário, sem informação a devolver. |
/exige tipo fracionário; converte comfromIntegral, nunca automaticamente.divarredonda o quociente para baixo emoddá o resto. Com divisor não nulo,(x div y)*y + (x mod y) == x; assim,(-7) div 3 = -3e(-7) mod 3 = 2.- Uma equação tipada pode ter domínio limitado: a fórmula de Heron exige lados positivos que respeitem as desigualdades do triângulo.
Ter tipo não garante sucesso nem terminação. head [] falha ao pedir o resultado; length [1..] não termina. Confere tipo, cobertura dos padrões, domínio e progresso até ao caso base. :t no GHCi mostra o tipo inferido.