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