我有一个名为X
的容器类型。由于我希望异构列表超过X
,因此其构造函数在某种类型变量a
上存在类型。但是,我希望它是Eq
类型类的实例。一个hackish解决方案看起来像这样:
{-# 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
如果它们的类型不同,则不相等。)
答案 0 :(得分:7)
添加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