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.
forall x. P(x)
ja exists x. P(x)
. Ob Typsysteme dies bei der Typenprüfung berücksichtigen ... Ich habe keine Ahnung. +1 für eine interessante Frage.