Po prostu czytam Dependent Types at Work. We wstępie do sparametryzowane typy, autor wspomina, że w tej deklaracjiParametryzowane typy indukcyjne w Agdzie
data List (A : Set) : Set where
[] : List A
_::_ : A → List A → List A
rodzaj List
jest Set → Set
i że A
staje niejawny argument obu konstruktorów, czyli tzw.
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
Cóż, starałem się go przerobić nieco inaczej
data List : Set → Set where
[] : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A
który niestety nie działa (Próbuję nauczyć Agda na dwa dni lub więcej, ale z tego co zebrałem to ponieważ konstruktory są parametryzowane przez Set₀
, a więc List A
musi być w Set₁
).
Rzeczywiście, co następuje akceptowane
data List : Set₀ → Set₁ where
[] : {A : Set₀} → List A
_::_ : {A : Set₀} → A → List A → List A
jednak nie jestem już w stanie wykorzystać {A : Set} → ... → List (List A)
(co jest całkowicie zrozumiałe).
Moje pytanie: jaka jest rzeczywista różnica między List (A : Set) : Set
a List : Set → Set
?
Dziękujemy za poświęcony czas!
Dzięki za odpowiedź! Jest jeszcze jedna rzecz, którą chciałbym wiedzieć (moje pytanie mogło być nieco niejednoznaczne, obawiam się): Nie mogę zdefiniować 'List' jako' Set → Set', aby zapobiec niespójności w systemie typu, jaki jest faktyczny mechanizm, który sprawia, że 'List (A: Set): Set'" work "? Ponieważ dla mnie (wywodzące się z Haskella) oba wydają się być 'listą danych :: * -> * gdzie (...)', ale jedna działa, a druga nie. Dzięki! – Vitus
Myślę, że już podałeś powód; aby uniknąć niespójności, konstruktory z Ustaw jako argument muszą należeć do Set₁. Parametryczne typy danych pozwalają nam zapisywać typy danych, które ze wskazaniami musiałyby kończyć się o jeden poziom "wyższy", i "działały" tylko z powodu dobrze zachowanych warunków parametrycznych typów danych. Z drugiej strony, istnieją pewne kontrowersje, jak "bezpieczne" są rodziny indukcyjne, jak ilustruje to strona wiki, i myślę, że obecny konsensus polega na tym, by mieć mały i zaufany kod Agdy, do którego można tłumaczyć fantazyjne typy danych. – danr
To oczyszcza to dla mnie, dzięki. Oto twoja zasłużona nagroda. – Vitus