我有一个数据类型
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/