我有一些具有不同属性的对象,例如:
newtype Symbol = Symbol String
newtype Charge = Charge Int
...
原则上,第二个参数可能是任意的:String
,Int
,Float
等等。
我有一个包装这些类型的数据类型:
data Property = forall a. (Show a) => Property a
但我需要如何比较这些实例。如果我写这样的东西:
instance Eq Property where
(Property a) == (Property b) = a == b
它失败,因为编译器不知道a和b的类型。
问题是,如何使用这样的逻辑制作Eq
Property
实例:
a
和b
属于不同类型,即Symbol
与Charge
,则始终为False
。a
和b
属于同一类型,请检查a == b
答案 0 :(得分:5)
如果您愿意在Eq
的约束中将Typeable
和Show
添加到Property
,这绝对是可能的。
import Data.Typeable
data Property = forall a. (Show a, Eq a, Typeable a) => Property a
instance Eq Property where
Property a == Property b = Just a == cast b