Можно ли использовать GADT для доказательства неравенства типов в 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 Char@.
intIsNotChar :: Not (Equal Int Char)
intIsNotChar intIsChar = ???
Ясно типEqual Int Char
не имеет (не нижних) жителей, и поэтому семантически должно бытьabsurdEquality :: Equal Int Char -> a
функционировать ... но для жизни я могуНе могу придумать способ написать что-либо кроме использования.undefined
Так что либо: я
я что-то упустил, илиЕсть некоторые ограничения в языке, которые делают это невыполнимой задачей, и у меня нетНе удалось понять, что это такое.Я подозреваю, что ответ примерно такой: компилятор не может использовать тот факт, что нетEqual
конструкторы, которые нет есть а = б. Но если это так, что делает это правдой?