Così, nei miei continui tentativi di mezza capire Curry-Howard attraverso piccoli esercizi Haskell, ho ottenuto bloccato a questo punto:È possibile utilizzare i GADT per dimostrare le disuguaglianze di tipo in GHC?
{-# LANGUAGE GADTs #-}
import Data.Void
type Not a = a -> Void
-- | The type of type equality proofs, which can only be instantiated if a = b.
data Equal a b where
Refl :: Equal a a
-- | Derive a contradiction from a putative proof of @Equal Int [email protected]
intIsNotChar :: Not (Equal Int Char)
intIsNotChar intIsChar = ???
chiaramente il tipo Equal Int Char
non ha abitanti (non in basso), e quindi semanticamente ci dovrebbe essere una funzione absurdEquality :: Equal Int Char -> a
... ma per la vita di me non riesco a trovare un modo per scriverne uno diverso dall'uso di undefined
.
Quindi, o:
- mi manca qualcosa, o
- V'è una certa limitazione del linguaggio che rende questo un compito impossibile, e io non sono riuscito a capire che cosa è.
ho il sospetto che la risposta è qualcosa di simile: il compilatore è in grado di sfruttare il fatto che non ci sono Equal
costruttori che non hanno a = b. Ma se è così, cosa lo rende vero?
Vedere: http://typesandkinds.wordpress.com/2012/12/01/decidable-propositional-equality-in-haskell/ – glaebhoerl
@dbaupp: non è un duplicato - questa domanda non sta provando a fare nulla con una prova di disuguaglianza. –
@ C.A.McCann, ah si, credo che dovrei leggere più da vicino prima di iniziare a lanciare accuse selvagge. :) – huon