Pergunta
Comecei a ler sobre Gadt em Haskell Wiki, mas não me senti muito confortável em entender. Você recomenda um capítulo de livro específico ou uma postagem de blog explicando Gadt para um iniciante Haskell?
Solução
Apfelmus fez Tutorial em vídeo para Gadts o que pode ser útil.
Outras dicas
Eu gosto do exemplo no Manual do GHC. É simples e ilustra alguns pontos -chave:
Gadts permitem que você use o sistema de tipo Haskell para modelar o sistema de tipo de um idioma que você está implementando (a "linguagem do objeto")
Isso permite que a verificação estática de Haskell afirme que o seu "compilador passa" ou o que não é o tipo preservando. As funções que assumem termos de linguagem de objetos podem assumir que esses termos estão bem tocados. Funções que retornam termos em língua de objetos são necessários para produzir termos bem tocados.
A correspondência de padrões de um construtor GADT causa refinamento do tipo.
eval
tem tipoTerm a -> a
no geral, mas o lado direito paraeval (Lit i)
tem tipoInt
, porque o construtor esquerdo tinha tipoTerm Int
.O sistema Haskell não se importa com quais tipos você fornece aos seus construtores GADT. Poderíamos facilmente tornar todos os construtores em
data Term a
dê um resultado de tipoTerm a
, ouTerm Bool
, e asdata
A definição ainda passaria. Mas não poderíamos escrevereval :: Term a -> a
. Você escolhe o Gadt "Tags" para modelar sua Problema, para que as funções úteis que você deseja escrever sejam bem tocadas.
O wiki de Haskell Gadts para manequins é a melhor explicação que já vi.
O problema que eu (e suspeito que os outros) tenham com a maioria das apresentações é que eles mostram exemplos de Gadts em termos de sintaxe que não são óbvios Até que você entenda os Gadts. Isso torna os exemplos mais simples nos quais tudo é construído especialmente difícil de entender - você pode adivinhar o que muitos dos padrões estão fazendo, mas entender o papel exato de cada afirmação é desafiador.
O post "For Dummies" disseca e cria o significado da sintaxe ao longo do caminho para explicar seus próprios exemplos básicos, o que o torna um ponto de partida muito mais útil. Eu recomendo.