Haskell 比较大数据类型值的最简单方法是忽略一个字段或不忽略该字段
我正在使用库中的数据类型,它有很多构造函数,每个构造函数都有几个字段。每个构造函数都是使用记录语法定义的。每个构造函数都有同名的字段。我想检查此数据类型的值是否相等,但不检查此字段。我只是对它不感兴趣。最简单、最干净的方法是什么?很好,如果有这样的事情存在,我会非常高兴:Haskell 比较大数据类型值的最简单方法是忽略一个字段或不忽略该字段,haskell,equality,generic-programming,Haskell,Equality,Generic Programming,我正在使用库中的数据类型,它有很多构造函数,每个构造函数都有几个字段。每个构造函数都是使用记录语法定义的。每个构造函数都有同名的字段。我想检查此数据类型的值是否相等,但不检查此字段。我只是对它不感兴趣。最简单、最干净的方法是什么?很好,如果有这样的事情存在,我会非常高兴: equalsWithout ignoredField value1 value2 我能想到的最简单的方法是使用Show将此数据类型转换为[String],并比较结果列表。但我想避免这种情况,因为它需要编写大量样板代码,因为数
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
编译时是否知道ignoredField
?或者仅在运行时?将值从一个复制到另一个,然后比较:a{foo=foo b}==b
@WillemVanOnsemignoredField
在编译时已知。@soupi惊人!现在我觉得自己很愚蠢:(应该为这些愚蠢的问题感到羞耻。同时我真的很喜欢有这么简单和优雅的解决方案!如果你发布它,我可以接受作为答案。感谢你的回答!不幸的是,我不能拆分该字段。因为我正在使用问题中提到的库中的数据类型,它不是我自己的:(虽然我同意你的看法,这种设计在某种意义上会更好。好吧,也许下一个最好的是@soupi's,但这一个也相当不错。)我不想编写MyDataCompariables
函数,因为数据类型有几十个构造函数。我不能使用元组,因为这些构造函数有不同类型的字段。尽管我可以转换为[String]
,正如我在问题中提到的。是的,我真的很喜欢@soupi的答案:)另一个答案令人失望。:)再次感谢!我还想指出,这种方法还可以扩展到任意数量的字段。