GADT,非参数化类型和实例Eq

Sop*_*hie 1 haskell existential-type gadt

我有一个容器类型,叫做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
Run Code Online (Sandbox Code Playgroud)

这个问题最简单(干净)的解决方案是什么?

(X如果它们的类型不同,则不相等.)

Dan*_*ner 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
Run Code Online (Sandbox Code Playgroud)