我试图用union操作定义Haskell整数集作为Monoid.
module MyMonoid where
import qualified Data.IntSet as S
data MyMonoid = MyMonoid S.IntSet
instance Monoid MyMonoid where
mempty = MyMonoid S.empty
MyMonoid m1 `mappend` MyMonoid m2 = MyMonoid (S.union m1 m2)
Run Code Online (Sandbox Code Playgroud)
我收到了错误
• No instance for (Semigroup Markup)
arising from the superclasses of an instance declaration
• In the instance declaration for ‘Monoid MyMonoid’
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?这看起来很简单,我复制的语法我像例子中看到这个,但我不明白为什么这个错误发生.
ama*_*loy 20
由于编写了这个游览,(<>)
已经从Monoid移动到Semigroup,并且所有Monoid实例都需要也是Semigroup.mappend
只是一个同义词(<>)
.所以,你需要两个实例:
instance Semigroup MyMonoid where
MyMonoid m1 <> MyMonoid m2 = MyMonoid (S.union m1 m2)
instance Monoid MyMonoid where
mempty = MyMonoid S.empty
Run Code Online (Sandbox Code Playgroud)