在Haskell中比较不同的类型

时间:2017-02-25 23:15:09

标签: haskell

我有一些具有不同属性的对象,例如:

newtype Symbol = Symbol String
newtype Charge = Charge Int
...

原则上,第二个参数可能是任意的:StringIntFloat等等。

我有一个包装这些类型的数据类型:

data Property = forall a. (Show a) => Property a

但我需要如何比较这些实例。如果我写这样的东西:

instance Eq Property where
    (Property a) == (Property b) = a == b

它失败,因为编译器不知道a和b的类型。

问题是,如何使用这样的逻辑制作Eq Property实例:

  1. 如果ab属于不同类型,即SymbolCharge,则始终为False
  2. 如果ab属于同一类型,请检查a == b

1 个答案:

答案 0 :(得分:5)

如果您愿意在Eq的约束中将TypeableShow添加到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