【发布时间】:2016-09-07 08:55:43
【问题描述】:
我有一个类型类:
class Wrapper w where
open :: w -> Map String Int
close :: Map String Int -> w
它看起来不是很有用,但我用它来强烈(不仅仅是type 同义词)区分语义上不同的Map String Ints 变体:
newtype FlapMap = Flap (Map String Int)
newtype SnapMap = Snap (Map String Int)
...
并且仍然具有对任何类型的类进行操作的函数。
- 有没有更好的方法来进行这种区分(可能没有
Wrapper实例样板)?
我想这样做:
instance (Wrapper wrapper) => Show wrapper where
show w = show $ toList $ open w
而不是编写许多样板文件Show 实例。
通过FlexibleInstances 和UndecidableInstances,GHC 将我引导到它认为我的实例声明适用于所有事物的地步,因为据称它与我的代码和GHC.Show 中的其他Show 实例发生冲突。 HaskellWiki 和 StackOverflow 的回答者和 HaskellWiki 说服我 OverlappingInstances 不是很安全,可能会令人困惑。 GHC 甚至不建议这样做。
为什么 GHC 首先抱怨不知道选择哪个 fx
Show Int实例(那么为什么它不查看我在编译时给出的约束?)然后,被告知实例可能重叠,突然知道怎么办了?我可以避免允许
OverlappingInstances与我的newtypes 一起使用吗?
【问题讨论】:
-
deriving Show与您想要实现的目标不同吗? -
是的。我不只是想要
FlapMap (fromList [...])。 -
我不会覆盖
Show实例,因为它对于创建输出、在 ghci 中显示并将其复制到测试用例非常有帮助——尤其是与漂亮打印库结合使用时。我宁愿创建一个 UserFriendlyShow 类型类 - 但无论如何你都需要 OverlappingInstances。
标签: haskell typeclass newtype overlapping-instances