假设我想让所有数字成为Monoid
。而不必为每个实例创建一个实例Num
像这样:
instance Monoid Int where
mappend = (+)
mempty = 0
instance Monoid Float where
mappend = (+)
mempty = 0.0
-- etc
有这样的事吗?
instance Num t => Monoid t where
mappend = (+)
mempty = 0
Edit
有些人用 GHC 扩展来回答并警告潜在的问题;我发现这些信息很丰富,但我想我会坚持下去Sum
, Product
以及无论如何coerce https://wiki.haskell.org/GHC/Coercible does.
我将其解释为询问一般前提,而不是具体询问Monoid
and Num
.
也许您可以通过启用语言扩展FlexibleInstances、UndecidableInstances 和使用重叠实例来使您编写的内容正常工作。
但你可能不想:似乎 instance Num t => Monoid t where ...
正在说
"If t
是一个实例Num
,这是如何制作的t
的一个实例Monoid
..."
不幸的是,这是不对的。它实际上所说的更像是
“以下是如何制作t
的一个实例Monoid.
首先,有必要的是t
是一个实例Num
。下一个...”
因此,如果您编写这样的实例声明,则无法编写任何其他实例声明。 (至少不是没有OverlappingInstances
,这会带来自己的问题。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)