Nella logica (classico o intuizionistici), le formule
(exists x. p x) -> q
forall x. (p x -> q)
sono equivalenti (si noti che q
non dipende x
sopra). Questo può essere usato per esprimere la quantificazione esistenziale in termini di quantificazione universale, a patto che le menzogne esistenziali a sinistra siano implicite. (Ecco un classico proof.)
Nella programmazione funzionale, è possibile ottenere lo stesso risultato. Invece di scrivere
-- Pseudo-Haskell follows
f :: (exists a. (a, a->Int)) -> Int
f (x,h) = h x
possiamo usare
-- Actual Haskell
f :: forall a. (a, a->Int) -> Int
f (x,h) = h x
in modo che possiamo fare a meno di quantificazione esistenziale, almeno in casi come quello di cui sopra.
La quantificazione esistenziale è ancora necessaria quando si verifica non a sinistra di una freccia. Ad esempio,
g :: exists a. (a, a->Int)
g = (2 :: Int, \x -> x+3)
Ahimè, Haskell ha scelto di non includere questi tipi. Probabilmente, questa scelta è stata fatta per mantenere il sistema di tipo già sofisticato dal diventare troppo complesso.
Ancora, Haskell ha tipi di dati esistenziali, che richiedono solo di avvolgere/scartare un costruttore attorno all'esistente. Ad esempio, utilizzando la sintassi GADT, possiamo scrivere:
data Ex where
E :: forall a. (a, a->Int) -> Ex
g :: Ex
g = E (2 :: Int, \x -> x+3)
Infine, permettetemi di aggiungere che esistenziali possono essere simulate da rango-2 tipi e continuazione-passing:
g :: forall r. (forall a. (a, a->Int) -> r) -> r
g k = k (2 :: Int, \x -> x+3)
si può aggiungere la derivazione passaggi per come '(esiste x. px) -> q' e' forall x. (p x -> q) 'sono equivalenti? Ho difficoltà a capirlo usando le leggi della logica classica. – Sibi
È possibile "provare" l'equivalenza in Haskell: 'data Ex (p :: * -> *) dove Ex :: px -> Ex p' e' iso1 :: (Ex p -> q) -> (forall x .px -> q); iso1 f a = f (Ex a) '' iso2 :: (per tutti x. p x -> q) -> (Ex p -> q); iso2 f (Ex a) = f a'. La prova "classica" si trova nella risposta a questa [domanda] (http://stackoverflow.com/questions/10753073/whats-the-etical-basis-for-existential-types?rq=1). – user2407038