haskell - 仅覆盖 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)
但有没有更清洁的方法?
解决方案
你也许可以做这样的事情:
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
任何我们喜欢的类型......)
推荐阅读
- c# - 为什么 webhook 将 json 发送到 InputStream 而不是 asp.net 控制器的操作参数?
- rest - Vibe.d REST 接口服务图像
- elasticsearch - 在 ElasticSearch 中的文本字段上启用 fielddata 但聚合不起作用
- sql - 关于从数据库中完全删除记录的建议
- python - 使用卷挂载的 Docker 上的事件侦听器不起作用
- c# - 在 C# 中忽略通过 `dataSet.ReadXml` 解析 `CDATA`
- xml - Xpath - 如何在同一级别java中获取下一行的文本
- performance - 执行压力测试时 HTTP 和 HTTPS 之间的区别
- javascript - 单击父元素时的JS函数,但单击子元素时返回false
- flutter - Flutter - 仅扩展扩展高度