【发布时间】:2018-12-08 13:29:09
【问题描述】:
我有一个大额类型
data Value
= VNull
| VDouble !Double
| VSci !Scientific
| VInt !Int
| VText !Text
| VTexts ![Text]
| VByteString !BS.ByteString
| VUTCTime !UTCTime
-- This goes on for quite a few more lines
我需要这个数据类型的 Hashable 实例。我当然可以手动输入实例,但幸运的是,hashWithSalt 有一个基于泛型的默认实现。
不幸的是 - 据我了解 - 这需要任何可以“打包”在 Value 类型中的类型都具有 Hashable 实例。好吧,UTCTime 没有。
所以看起来我可以在两个“次优”解决方案之间进行选择:
- 手动键入 Hashable 实例。
- 编写一个 Hashable UTCTime 的孤儿实例
我认为应该有第三种“最佳”方式:只为无法自动执行的值构造函数编写实现,即执行以下操作:
instance Hashable Value where
hashWithSalt (VUTCTime t) = ... -- custom implementation
hashWithSalt _ = ... -- use the default implementation
当然可以更一般地问这个问题:我如何在某些值构造函数的情况下重用现有实例实现,同时在特定情况下拥有自己的实现 而不必为每个值构造函数编写样板.
【问题讨论】:
标签: haskell types generic-programming