Ich möchte wissen , ob ein universell quantifizierte Typ : T a = ∀ X : { a ∈ X , f : X → { T , F } } ist ein Untertyp oder Sonderfall einer existentiell quantifiziert Typ T e mit derselben Signatur: T e = ∃ X : { a ∈ X , f : X → { T , F } }
Ich würde "ja" sagen: Wenn etwas wahr ist "für alle X" ( für alle X ), dann muss es auch wahr sein "für einige X" ( ). Das heißt, eine Anweisung mit ' ' ist einfach eine eingeschränktere Version derselben Anweisung mit ' ':∃ X ∀ ∃ ∀ X , P ( X ) ?
Irre ich mich irgendwo
Hintergrund: Warum frage ich das?
Ich studiere existenzielle Typen, um zu verstehen, warum und wie "abstrakte [Daten] Typen existenzielle Typen haben" . Ich kann dieses Konzept nicht allein aus der Theorie verstehen. Ich brauche auch konkrete Beispiele.
Leider sind gute Codebeispiele schwer zu finden, da die meisten Programmiersprachen existenzielle Typen nur eingeschränkt unterstützen. (Zum Beispiel die Platzhalter von Haskell
forall
oder Java?
.) Auf der anderen Seite werden universell quantifizierte Typen von vielen neueren Sprachen über "Generics" unterstützt.Was noch schlimmer ist, Generika scheinen auch leicht mit existenziellen Typen verwechselt zu werden, was es noch schwieriger macht, existenzielle von universellen Typen zu unterscheiden. Ich bin gespannt, warum diese Verwechslung so leicht vorkommt. Eine Antwort auf diese Frage könnte es erklären: Wenn universelle Typen in der Tat nur ein Sonderfall existenzieller Typen sind, ist es kein Wunder, dass generische Typen, z. B. Javas
List<T>
, so oder so interpretiert werden können.
quelle
forall x. P(x)
jaexists x. P(x)
. Ob Typsysteme dies bei der Typenprüfung berücksichtigen ... Ich habe keine Ahnung. +1 für eine interessante Frage.Antworten:
Lassen Sie sich nicht von Haskells irreführen
forall
: Trotz seines Namens handelt es sich um eine Art existenziellen Quantifikator.Für den Hintergrund empfehle ich dringend Typen und Programmiersprachen (Kapitel 23 und 24 behandeln universelle Typen bzw. existenzielle Typen). Es bietet nützliche Hintergrundinformationen zum Verständnis von Forschungsartikeln.
quelle
forall
ist in der Tat ein universeller Quantifizierer im ursprünglichen Kontext der impliziten Quantifizierung, die er explizit macht, nämlich die Betrachtung polymorpher Typen "von außen" für Definitionen auf oberster Ebene. Im "Inneren" einer solchen Definition sind polymorphe Typen bei der Manipulation von Argumenten tatsächlich existenziell. Jede Typvariable ist an einen Typ gebunden, aber wir wissen (und können) nicht, was dieser Typ ist. Meines Wissens unterstützt keine Haskell-Implementierung echte (rohe, übergeordnete) existenzielle Typen, und mir ist nicht klar, welchem Zweck dies überhaupt dienen würde.Der Artikel, den Sie für existenzielle Typen erwähnen, ist ein bisschen theoretisch. Ein weiterer Tutorial-Artikel ist der Artikel von Cardelli und Wegner: Zum Verständnis von Typen, Datenabstraktion und Polymorphismus . In den meisten fortgeschrittenen Lehrbüchern über Programmiersprachen würden auch existenzielle Typen erörtert. Ein gutes Buch zum Nachschlagen wäre Mitchells Grundlagen der Programmiersprachen .
Sie haben Recht, dass die meisten Programmiersprachen nicht explizit existenzielle Typen haben. Viele haben jedoch abstrakte Typen (oder einen anderen Namen wie "Pakete" oder "Module"). Sie können also Werte existenzieller Typen ausdrücken , obwohl sie solche Werte nicht als erstklassige Entitäten behandeln.
quelle