In der Logik (klassische oder intuitionistic), die Formeln
(exists x. p x) -> q
forall x. (p x -> q)
gleichwertig sind (beachten Sie, dass q
nicht auf x
oben abhängt). Dies kann verwendet werden, um die existenzielle Quantifizierung in Form einer universellen Quantifizierung auszudrücken, vorausgesetzt, das Existenzielle liegt auf der linken Seite implizit. (Hier ist eine klassische proof.)
In der funktionalen Programmierung können Sie das gleiche erreichen. Statt
-- Pseudo-Haskell follows
f :: (exists a. (a, a->Int)) -> Int
f (x,h) = h x
schreiben, können wir
-- Actual Haskell
f :: forall a. (a, a->Int) -> Int
f (x,h) = h x
verwenden, so können wir ohne existenzielle Quantifizierung tun, zumindest in Fällen wie dem oben.
Existenzielle Quantifizierung wird immer noch benötigt, wenn sie nicht auf der linken Seite eines Pfeils auftritt. Zum Beispiel
g :: exists a. (a, a->Int)
g = (2 :: Int, \x -> x+3)
Leider hat sich Haskell entschieden, diese Typen nicht einzuschließen. Wahrscheinlich wurde diese Entscheidung getroffen, um zu verhindern, dass das bereits hoch entwickelte System zu komplex wird.
Dennoch hat Haskell existenzielle Datentypen, die nur einen Konstruktor um das Existentialumwickeln müssen. Zum Beispiel GADT Syntax verwenden, können wir schreiben:
data Ex where
E :: forall a. (a, a->Int) -> Ex
g :: Ex
g = E (2 :: Int, \x -> x+3)
Abschließend möchte ich hinzufügen, dass Existenziale kann auch durch Rang-2-Typen und Fortgang simuliert werden:
g :: forall r. (forall a. (a, a->Int) -> r) -> r
g k = k (2 :: Int, \x -> x+3)
Können Sie die Ableitung hinzufügen Schritte für wie '(existiert x. px) -> q 'und' forall x. (p x -> q) 'sind äquivalent? Es fällt mir schwer, es anhand der Gesetze der klassischen Logik herauszufinden. – Sibi
Sie können die Äquivalenz in Haskell "beweisen": 'Daten Ex (p :: * -> *) wobei Ex :: px -> Ex p' und' iso1 :: (Ex p -> q) -> (forall x . px -> q); iso1 f a = f (Ex a) "iso2 :: (für alle x. p x -> q) -> (Ex p -> q); iso2 f (Ex a) = f a '. Der "klassische" Beweis findet sich in der Antwort auf diese Frage (http://stackoverflow.com/questions/10753073/whats-the-theoretical-basis-for-existential-types?rq=1). – user2407038