Haskell GADT、非amerized类型及其实例Eq

Haskell GADT、非amerized类型及其实例Eq,haskell,gadt,existential-type,Haskell,Gadt,Existential Type,我有一个容器类型,叫做X。因为我希望异构列表覆盖X,所以它的构造函数是在某个类型变量a上存在类型的。但是,我希望它是Eqtype类的一个实例。黑客解决方案如下所示: {-# LANGUAGE GADTs #-} data X where X :: (Eq a, Show a) => a -> X instance Eq X where X x == X y = show x == show y 这个问题最简单(干净)的解决方案是什么 (Xs不相等,如果它们没有相同的类型

我有一个容器类型,叫做
X
。因为我希望异构列表覆盖
X
,所以它的构造函数是在某个类型变量
a
上存在类型的。但是,我希望它是
Eq
type类的一个实例。黑客解决方案如下所示:

{-# LANGUAGE GADTs #-}

data X where X :: (Eq a, Show a) => a -> X

instance Eq X where
    X x == X y = show x == show y
这个问题最简单(干净)的解决方案是什么


X
s不相等,如果它们没有相同的类型。)

添加
Typeable
,这样您就有了该类型的运行时表示;然后使用
cast
将其中一个转换为适当的类型

{-# LANGUAGE GADTs #-}
import Data.Typeable

data X where X :: (Eq a, Typeable a) => a -> X

instance Eq X where 
    X x == X y = Just x == cast y

添加
Typeable
,以便您拥有该类型的运行时表示;然后使用
cast
将其中一个转换为适当的类型

{-# LANGUAGE GADTs #-}
import Data.Typeable

data X where X :: (Eq a, Typeable a) => a -> X

instance Eq X where 
    X x == X y = Just x == cast y