代码之家  ›  专栏  ›  技术社区  ›  Shersh

比较大数据类型值的最简单方法是忽略一个字段或不包含该字段

  •  2
  • Shersh  · 技术社区  · 7 年前

    记录语法

    equalsWithout ignoredField value1 value2
    

    我能想到的最简单的方法是将此数据类型转换为 [String] 使用 Show 并比较结果列表。但我想避免这种情况,因为它需要编写很多样板代码,因为数据类型有很多构造函数……也许有更干净的方法来实现这一点。

    3 回复  |  直到 7 年前
        1
  •  2
  •   soupi    7 年前

    根据您的要求:

    将值从一个复制到另一个,然后进行比较:

    a { foo = foo b } == b

        2
  •  2
  •   NovaDenizen    7 年前

    也许最好的方法是把这个字段从你的类型中分离出来。而不是

    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
    
        3
  •  2
  •   Rein Henrichs    7 年前

    如果您无法分割出要避免比较的项,那么下一个最佳解决方案是将其余数据投影到一个方便的结构中 Eq

    import Data.Function (on)
    
    myDataComparables (MyData a b c d) = (b,c,d)
    
    instance Eq MyData where
      (==) = (==) `on` myDataComparables