比较忽略一个字段或没有该字段的大数据类型值的最简单方法

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