我有一些具有不同属性的对象,例如:
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:
a和b是不同类型的,即SymbolVS Charge它始终是False.a和b属于同一类型,检查a == b 如果你愿意添加Typeable和Eq加入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)