Mithilfe der Church-Codierung kann jeder beliebige algebraische Datentyp ohne Verwendung des integrierten ADT-Systems dargestellt werden. Zum Beispiel kann Nat
dargestellt (in Idris Beispiel) werden als:Ist es möglich, eine Typ-Level-Darstellung generischer ADTs zu erstellen?
-- Original type
data Pair_ : (a : Type) -> (b : Type) -> Type where
mkPair_ : (x:a) -> (y:b) -> Pair_ a b
-- Lambda encoded representation
Par : Type -> Type -> Type
Par a b = (t:Type) -> (a -> b -> t) -> t
pair : (ta : Type) -> (tb : Type) -> (a:ta) -> (b:tb) -> Par ta tb
pair ta tb a b k t = t a b
fst : (ta:Type) -> (tb:Type) -> Par ta tb -> ta
fst ta tb pair = pair ta (\ a, b => a)
snd : (ta:Type) -> (tb:Type) -> Par ta tb -> tb
snd ta tb pair = pair tb (\ a, b => b)
Und so weiter:
-- Original type
data Nat : Type where
natSucc : Nat -> Nat
natZero : Nat
-- Lambda encoded representation
Nat : Type
Nat = (Nat : Type) -> (Nat -> Nat) -> Nat -> Nat
natSucc : Nat -> Nat
natSucc pred n succ zero = succ (pred n succ zero)
natZero : Nat
natZero n succ zero = zero
Pair
kann dargestellt werden. Jetzt ist das Schreiben dieser Typen, Konstruktoren, Matcher eine sehr mechanische Aufgabe. Meine Frage ist: Wäre es möglich, eine ADT als Spezifikation auf der Typ-Ebene darzustellen, dann die Typen selbst (d. H. Nat
/Par
), sowie die Konstruktoren/Destruktoren automatisch aus diesen Spezifikationen abzuleiten? Können wir diese Spezifikationen auch verwenden, um Generika abzuleiten? Beispiel:
NAT : ADT
NAT = ... some type level expression ...
Nat : Type
Nat = DeriveType NAT
natSucc : ConstructorType 0 NAT
natSucc = Constructor 0 NAT
natZero : ConstructorType 1 NAT
natZero = Constructor 1 NAT
natEq : EqType NAT
natEq = Eq NAT
natShow : ShowType NAT
natShow = Show NAT
... and so on
Beachten Sie, dass, soweit ich weiß, diese Kirche-Kodierungen abhängige Eliminierungen fehlen. Z.B. Wenn 'Bool = (A: Typ) -> A -> A -> A 'und' tru, fls' entsprechend definiert sind, können Sie nicht beweisen '(b: Bool) -> (b = tru \/b = fls) ', während Sie mit induktiven Typen können. – chi
Sie können das für ein sehr ausdrucksvolles Typensystem tun: vollständige abhängige Typen + induktive Familien. Abgeleitetes "Nat" ist dann ein Eliminator "Nat = (P: Nat -> Typ) -> (für alle n. P n -> P (succ n)) -> P 0 -> für n. Pn'. Ich schrieb dazu einen [Blogpost] (http://effectifully.blogspot.com/2016/06/deriviving-eliminators-of-described-data.html). 'EqType' ist [ableitbar] (https://github.com/effectively/Generic/blob/master/Property/Eq.agda) auch (ein [Beispiel] (https://github.com/effectively/Generic/blob /master/Examples/Eq.agda)). Wie viele Arten möchten Sie abdecken? Nur System F-Typen und keine GADTs? – user3237465
@chi: In der Tat scheint dies eine Quelle zu sein, die Ihre Behauptung bestätigt: [Induktion ist in der Theorie abhängiger Typen zweiter Ordnung nicht ableitbar] (https://scholar.google.com.sg/scholar?cluster=4467817914024141350&hl=de&as_sdt=0 , 5) – Cactus