Estoy leyendo Dependent Types at Work. En la introducción de tipos parametrizado, el autor menciona que en esta declaraciónTipos inductivos parametrizados en Agda
data List (A : Set) : Set where
[] : List A
_::_ : A → List A → List A
del tipo de List
es Set → Set
y que se convierte en A
argumento implícito a ambos constructores, es decir.
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
Bueno, he intentado volver a escribir un poco diferente
data List : Set → Set where
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
que lamentablemente no funciona (estoy tratando de aprender Agda durante dos días más o menos, pero por lo que deduje que es porque los constructores están parametrizados en Set₀
y entonces List A
debe estar en Set₁
).
De hecho, se acepta la siguiente
data List : Set₀ → Set₁ where
[] : {A : Set₀} → List A
_::_ : {A : Set₀} → A → List A → List A
sin embargo, ya no soy capaz de utilizar {A : Set} → ... → List (List A)
(lo cual es perfectamente comprensible).
Entonces mi pregunta: ¿Cuál es la diferencia real entre List (A : Set) : Set
y List : Set → Set
?
¡Gracias por su tiempo!
Gracias por su respuesta! Todavía hay una cosa que me gustaría saber (mi pregunta podría haber sido un poco ambigua, me temo): no puedo definir 'List' como' Set → Set' para evitar incoherencias en el sistema de tipos, ¿cuál es el verdadero mecanismo que hace 'List (A: Set): Set'" work "? Porque para mí (proveniente del pasado de Haskell), ambos parecen ser 'data List :: * -> * donde (...)', pero uno funciona y el otro no. ¡Gracias! – Vitus
Creo que ya has indicado el motivo; para evitar inconsistencias, los constructores con Set como argumento deben pertenecer necesariamente en Set₁. Los tipos de datos paramétricos nos permiten escribir tipos de datos que con indicies tendrían que terminar en un nivel "más alto", y "funciona" simplemente debido a las buenas condiciones de los tipos de datos paramétricos. Por otro lado, existe cierta controversia sobre cuán "seguras" son las familias inductivas, como lo ilustra la página de la wiki, y creo que el consenso actual es tener algún código Agda pequeño y confiable al que se puedan traducir los tipos de datos sofisticados. – danr
Eso lo aclara, gracias. Aquí está tu bien merecida recompensa. – Vitus