Tipos algébricos e recursão

Definir tipos com data, encaixe de padrões e recursão sobre listas e árvores.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Tipos, construtores e padrões

  • type Ponto = (Double,Double) é um sinónimo. data Dia = Seg | Ter cria um tipo novo com alternativas próprias.
  • O nome do tipo aparece nas assinaturas; os construtores aparecem nos valores e nos padrões.
  • Maybe a distingue Nothing de Just x: a ausência passa a ser um caso a tratar, não um erro escondido.
  • deriving (Eq,Show) gera implementações a partir dos campos. Num tipo parametrizado, comparar exige igualdade dos elementos.
  • Either erro valor permite ainda explicar por que o cálculo falhou.
data Arvore a = Vazia | No a (Arvore a) (Arvore a)

emOrdem :: Arvore a -> [a]
emOrdem Vazia = []
emOrdem (No x esq dir) = emOrdem esq ++ [x] ++ emOrdem dir

Cada equação desmonta um construtor; a recursão segue os componentes menores. Como nas listas, o caso vazio termina a recursão.

Árvores de pesquisa

  • Invariância: a esquerda tem valores menores que o nó, a direita maiores ou iguais. A condição vale em cada nó.
  • inserir conserva a invariância; procura usa-a para excluir uma subárvore por comparação.
  • A travessia em ordem de uma árvore de pesquisa devolve os valores ordenados, mesmo com duplicados.
  • O custo segue a altura, não log n por decreto: numa árvore degenerada degrada-se para linear. inserir desta lição não equilibra.
  • Indica a convenção de altura: aqui a árvore vazia tem altura zero e uma folha tem altura um.

Provar e transformar

Para provar length (map f xs) = length xs em listas finitas, usa indução: o caso vazio por cálculo direto, o passo aplicando a hipótese à cauda. Testar exemplos reforça a confiança; não substitui a prova.

  • Substituir variáveis conserva a expressão: lookup decide por folha. Nothing conserva a variável; Just n constrói a constante. Nunca inventes zero para a variável ausente.
  • Com nomes repetidos no ambiente, lookup usa a primeira ocorrência: decide essa política antes de escrever o resultado.
  • Para converter tipos recursivos, transforma cada componente e conserva a ordem. Folha x vira Rosa x []; Ramo e x d vira Rosa x [conversao e, conversao d].
  • Cada chamada recursiva recebe uma subexpressão ou subárvore própria: essa é a medida de progresso em entradas finitas.

Recursão estrutural e contratos.

À 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.