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

时间:2016-09-11 21:41:37

标签: haskell gadt existential-type

我有一个名为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如果它们的类型不同,则不相等。)

1 个答案:

答案 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