GADT、未参数化类型和它们的实例 Eq

GADTs, unparametrized types and instance Eq for them

我有一个容器类型,叫做 X。因为我想要 X 上的异构列表,所以它的构造函数是基于某个类型变量 a 存在类型的。但是,我希望它是 Eq 类型 class 的一个实例。一个骇人听闻的解决方案如下所示:

{-# 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如果类型不同则不相等。)

添加 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