我有一个类型类:如何在我自己的类型类中为所有类型声明类型类型的实例(如显示)?
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
和UndecidableInstances
,GHC使我在认为我的实例声明适用于一切,它据称在我的代码和GHC.Show
其他Show
实例擦出点。 HaskellWiki和StackOverflow回答者和HaskellWiki说服我OverlappingInstances
是不是很安全,可能会令人困惑。 GHC甚至没有建议。
为什么GHC第一抱怨不知道该选择哪个FX
Show Int
的实例(所以为什么不看我给在编译时?约束),然后,被告知实例可能重叠,突然知道该怎么办?我可以避免允许
OverlappingInstances
与我的newtype
s吗?
“导出Show”与你想实现的不同吗? – chi
是的。我不只是想'FlapMap(fromList [...])'。 –
我不会重写'Show'实例,因为它对于创建输出非常有帮助,在ghci中显示它并将其复制到测试用例 - 特别是与漂亮的打印库结合使用时。我宁愿创建一个UserFriendlyShow类型类 - 但是无论如何你需要OverlappingInstances。 – epsilonhalbe