在Haskell中比较不同的类型

Ser*_*nin 0 haskell

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

newtype Symbol = Symbol String
newtype Charge = Charge Int
...
Run Code Online (Sandbox Code Playgroud)

原则上,第二个参数可以是任意的:String,Int,Float等.

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

data Property = forall a. (Show a) => Property a
Run Code Online (Sandbox Code Playgroud)

但我需要如何比较这些实例的方式.如果我写这样的话:

instance Eq Property where
    (Property a) == (Property b) = a == b
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 如果ab是不同类型的,即SymbolVS Charge它始终是False.
  2. 如果ab属于同一类型,检查a == b

Ale*_*lec 5

如果你愿意添加TypeableEq加入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
Run Code Online (Sandbox Code Playgroud)