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
我有一个容器类型,叫做 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