我有一个类型类:
class Wrapper w where
open :: w -> Map String Int
close :: Map String Int -> w
它看起来不是很有用,但我用它来强烈(不仅仅是type
同义词)区分语义上不同的Map String Int
s 变体:
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
and UndecidableInstances
,GHC 让我认为我的实例声明适用于所有内容,因为据称它与Show
我的代码和GHC.Show
. HaskellWiki 和 StackOverflow 的回答者和 HaskellWiki 说服我OverlappingInstances
不是很安全,而且可能令人困惑。GHC 甚至不建议这样做。
为什么 GHC 首先抱怨不知道
Show Int
选择哪个 fx 实例(那么为什么它不查看我在编译时给出的约束?)然后,被告知实例可能重叠,突然知道该怎么做?我可以避免
OverlappingInstances
使用我newtype
的 s 吗?