首页 > 解决方案 > 仅覆盖 Eq 实例实现中的少数数据案例

问题描述

我有一个数据类型

data MyType = Any | A | B | C ...

“Any”的语义是它应该等同于所有其他情况。我认为最优雅的方法是实现我自己的 Eq 实例,从

instance Eq MyType where
    Any == _ = True
    _ == Any = True

但现在我没有看到避免重复和愚蠢代码的方法

    A == A = True
    B == B = True
    ...

我虽然“滥用”显示功能并且只是这样做,x == y = (show x) == (show y)但有没有更清洁的方法?

标签: haskell

解决方案


你也许可以做这样的事情:

data Wildcard a = Any | Card a

data NewType = A | B | C | ... deriving Eq

type OldType = Wildcard NewType

instance (Eq a) => Eq (Wildcard a) where
  Any    == _      = True
  _      == Any    = True
  Card l == Card r = l == r

这样,编译器Eq OldType会为您自动派生,并且我们拥有Eq NewType预期的语义。(而且我们可以应用Any任何我们喜欢的类型......)


推荐阅读