Haskell 具有多个子字段的数据类型的实例Eq

Haskell 具有多个子字段的数据类型的实例Eq,haskell,Haskell,我有一个包含多个子字段的数据类型,希望同时实现实例Eq类 代码如下: data Expression = Variable { name :: String, number :: Double, exponentVal :: Double

我有一个包含多个子字段的数据类型,希望同时实现
实例Eq

代码如下:

data Expression 
                = Variable  {
                            name            ::  String,
                            number          ::  Double,
                            exponentVal     ::  Double 
                            }
                |   Numeric Double
                |   CanonicalForm [Expression]
    deriving Show 

instance Eq Expression where
    someone == another = name someone == name another
    someone == another = exponentVal someone == exponentVal another

如何修改
实例Eq
类,以便在比较两个变量时,比较同时计算
名称
字段和
指数
字段?

在定义中使用模式匹配

实例Eq表达式,其中
变量a b c==变量a'b'c=a==a'&&b==b'&&c==c'
--其他2例
_===错误

或者只需使用注释中已经指出的
推导Eq

要比较两个
变量
值,只需将两个字段比较与
和&
结合起来即可

instance Eq Expression where
    someone == another = name someone == name another && exponentVal someone == exponentVal another
但是,这忽略了两个参数都可能不是
变量的可能性。你应该使用模式匹配

instance Eq Expression where
    Variable n1 _ v1 == Variable n2 _ v2 = n1 == n2 && v1 == v2
    Number n1 == Number n2 = n1 == n2
    CanonicalForm es1 == CanonicalForm es2 = ...  -- appropriate definition here
    _ == _ = False

在上面,我假设如果数据构造函数不匹配,表达式就不相等。

从一个更简单的数据类型开始,逐步增加到一个更复杂的类型。在
变量“1==Numeric 1
中会发生什么?
名称(数字1)
中发生了什么?人们通常建议不要混合总和和记录类型,例如:这里的“同时”是什么意思?
派生(Show,Eq)
生成的实例有什么问题?