比较忽略一个字段或没有该字段的大数据类型值的最简单方法
Easiest way to compare values of big data type ignoring one field or without that field
我正在使用库中的数据类型,它有很多构造函数,每个构造函数都有几个字段。每个构造函数都是使用 Record Syntax 定义的。每个构造函数都有同名的字段。我想检查这种数据类型的值是否相等,但没有这个字段。我只是对此不感兴趣。最简单和最干净的方法是什么?完美,如果有这样的东西我会非常高兴:
equalsWithout ignoredField value1 value2
我能想到的最简单的方法是使用 Show
将此数据类型转换为 [String]
并比较结果列表。但我想避免这种情况,因为它需要编写大量样板代码,因为数据类型有很多构造函数......也许有更简洁的方法来实现这一点。
也许最好的方法是将该字段从您的类型中拆分出来。而不是
data MyData = C1 IgnoredType T1 T2
| C2 IgnoredType T2 T3
| C3 IgnoredType T4
你可以这样做:
data MySimpleData = C1 T1 T2
| C2 T2 T3
| C3 T4
deriving Eq
data WithIgnored a = WI IgnoredType a
instance Eq a => Eq (WithIgnored a) where
WI _ x == WI _ y = x == y
type MyData = WithIgnored MySimpleData
或不太灵活:
data MyData = MD IgnoredType MySimpleData
instance Eq MyData where
MD _ x == MD _ y = x == y
如果您无法拆分要避免比较的项目,那么下一个最佳解决方案是将其余数据投影到具有方便 Eq
实例的结构中,例如元组:
import Data.Function (on)
myDataComparables (MyData a b c d) = (b,c,d)
instance Eq MyData where
(==) = (==) `on` myDataComparables
根据您的要求:
将值从一个复制到另一个然后比较:
a { foo = foo b } == b
我正在使用库中的数据类型,它有很多构造函数,每个构造函数都有几个字段。每个构造函数都是使用 Record Syntax 定义的。每个构造函数都有同名的字段。我想检查这种数据类型的值是否相等,但没有这个字段。我只是对此不感兴趣。最简单和最干净的方法是什么?完美,如果有这样的东西我会非常高兴:
equalsWithout ignoredField value1 value2
我能想到的最简单的方法是使用 Show
将此数据类型转换为 [String]
并比较结果列表。但我想避免这种情况,因为它需要编写大量样板代码,因为数据类型有很多构造函数......也许有更简洁的方法来实现这一点。
也许最好的方法是将该字段从您的类型中拆分出来。而不是
data MyData = C1 IgnoredType T1 T2
| C2 IgnoredType T2 T3
| C3 IgnoredType T4
你可以这样做:
data MySimpleData = C1 T1 T2
| C2 T2 T3
| C3 T4
deriving Eq
data WithIgnored a = WI IgnoredType a
instance Eq a => Eq (WithIgnored a) where
WI _ x == WI _ y = x == y
type MyData = WithIgnored MySimpleData
或不太灵活:
data MyData = MD IgnoredType MySimpleData
instance Eq MyData where
MD _ x == MD _ y = x == y
如果您无法拆分要避免比较的项目,那么下一个最佳解决方案是将其余数据投影到具有方便 Eq
实例的结构中,例如元组:
import Data.Function (on)
myDataComparables (MyData a b c d) = (b,c,d)
instance Eq MyData where
(==) = (==) `on` myDataComparables
根据您的要求:
将值从一个复制到另一个然后比较:
a { foo = foo b } == b