haskell - 在 Eq 实例实现中仅覆盖少数情况的数据

标签 haskell

我有一个数据类型

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

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

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

但现在我看不到避免重复和愚蠢代码的方法,例如

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

虽然我“滥用”了 show 函数,只是执行 x == y = (show x) == (show y) 但有没有更简洁的方法?

最佳答案

你也许可以这样做:

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 应用于我们喜欢的任何类型...)

关于haskell - 在 Eq 实例实现中仅覆盖少数情况的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50349892/

相关文章:

haskell - 隐式类型强制?

loops - 好奇 Haskell 中如何评估 "loop = loop"

haskell - 如何在 Haskell 中使用 State monad 计算列表项?

macos - OS X 上的 Haskell SDL

haskell - 如何在optparse-applicative中获取 "leftover arguments"?

haskell - 设置graphics.gloss haskell

Haskell QuickCheck 唯一随机数生成

haskell - 如何使用 exceptT 替换大量 IO(a b)

Haskell 词法布局规则实现

haskell - 无法将预期类型 `()' 与实际类型 `Int' 匹配