I tipi di dati algebrici consentono di definire i tipi in modo ricorsivo. Concretamente, supponiamo di avere il tipo di dati
datalist=Nil|ConsofN×list
Ciò significa che è l'insieme più piccolo generato dal N i L e C o n s operatori. Possiamo formalizzare ciò definendo l'operatore F ( X )listNilConsF(X)
F(X)=={Nil}∪{Cons(n,x)|n∈N∧x∈X}
e quindi definire aslist
list=⋃i∈NFi(∅)
Un ADT generalizzato è ciò che otteniamo quando definiamo un operatore di tipo in modo ricorsivo. Ad esempio, potremmo definire il seguente tipo di costruttore:
busha=Leafofa|Nestofbush(a×a)
Questo tipo significa che un elemento di è una tupla di una s di lunghezza 2 n per qualche n , poiché ogni volta che entriamo nelcostruttore N e s t l'argomento type è accoppiato con se stesso. Quindi possiamo definire l'operatore di cui vogliamo prendere un punto fisso come:bushaa2nnNest
F(R)=λX.{Leaf(x)|x∈X}∪{Nest(v)|v∈R(X)}
Un tipo induttivo in Coq è essenzialmente un GADT, in cui gli indici dell'operatore tipo non sono limitati ad altri tipi (come ad esempio Haskell), ma possono anche essere indicizzati da valori della teoria dei tipi. Ciò consente di fornire tipi per elenchi indicizzati per lunghezza e così via.