Os tipos de dados algébricos permitem definir tipos recursivamente. Concretamente, suponha que tenhamos o tipo de dados
datalist=Nil|ConsofN×list
O que isto significa é que é o mais pequeno conjunto gerado pela N i l e C o n s operadores. Podemos formalizar isso definindo o operador F ( X )listNilConsF(X)
F(X)=={Nil}∪{Cons(n,x)|n∈N∧x∈X}
e, em seguida, definir comolist
list=⋃i∈NFi(∅)
Um ADT generalizado é o que obtemos quando definimos um operador de tipo recursivamente. Por exemplo, podemos definir o seguinte construtor de tipos:
busha=Leafofa|Nestofbush(a×a)
bushaa2nnNest
F(R)=λX.{Leaf(x)|x∈X}∪{Nest(v)|v∈R(X)}
Um tipo indutivo em Coq é essencialmente um GADT, onde os índices do operador de tipo não são restritos a outros tipos (como, por exemplo, Haskell), mas também podem ser indexados por valores da teoria de tipos. Isso permite que você forneça tipos para listas indexadas por comprimento e assim por diante.