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)
生成的实例有什么问题?