Expressões, avaliação e tipos em Haskell

Avaliar expressões por substituição, definir funções por equações e ler tipos predefinidos.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Avaliar por substituição

  • Uma equação define um resultado por substituição. Com dobra x = 2*x, dobra (3+1) reduz a 2*(3+1) e dá 8.
  • x nomeia 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 + 1 dá 7, f x y é (f x) y. Um número negativo como argumento escreve-se f (-3).
  • where dá 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:xs separa 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 é True e fica no fim.
  • Usa padrões para a forma dos dados e guardas para condições sobre valores. O if precisa de else, e ambos os ramos têm o mesmo tipo.

Tipos, divisão e domínio

TipoValores
Int, IntegerInteiros de precisão fixa e arbitrária.
Float, DoubleAproximações em vírgula flutuante.
Bool, CharTrue/False e carateres como 'a'.
StringSinó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 com fromIntegral, nunca automaticamente.
  • div arredonda o quociente para baixo e mod dá o resto. Com divisor não nulo, (x div y)*y + (x mod y) == x; assim, (-7) div 3 = -3 e (-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.

Escolha entre if, guardas e padrões.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.