Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 比较大数据类型值的最简单方法是忽略一个字段或不忽略该字段_Haskell_Equality_Generic Programming - Fatal编程技术网

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
@WillemVanOnsem
ignoredField
在编译时已知。@soupi惊人!现在我觉得自己很愚蠢:(应该为这些愚蠢的问题感到羞耻。同时我真的很喜欢有这么简单和优雅的解决方案!如果你发布它,我可以接受作为答案。感谢你的回答!不幸的是,我不能拆分该字段。因为我正在使用问题中提到的库中的数据类型,它不是我自己的:(虽然我同意你的看法,这种设计在某种意义上会更好。好吧,也许下一个最好的是@soupi's,但这一个也相当不错。)我不想编写
MyDataCompariables
函数,因为数据类型有几十个构造函数。我不能使用元组,因为这些构造函数有不同类型的字段。尽管我可以转换为
[String]
,正如我在问题中提到的。是的,我真的很喜欢@soupi的答案:)另一个答案令人失望。:)再次感谢!我还想指出,这种方法还可以扩展到任意数量的字段。