一个基本的Monoid定义给出了"实例声明的超类引起的(Semigroup MyMonoid)没有实例"

W.P*_*ill 15 haskell monoids

我试图用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)