Базовое определение Monoid дает «Нет экземпляра для (полугруппы MyMonoid), возникающего из суперклассов объявления экземпляра» - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь определить целочисленные наборы Haskell с помощью операции объединения как Моноид .

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)

Я получаю ошибку

• No instance for (Semigroup Markup)
    arising from the superclasses of an instance declaration
• In the instance declaration for ‘Monoid MyMonoid’

Что яделать неправильно?Это кажется таким простым, и я копирую синтаксис, который я вижу в примерах вроде this , но я не могу понять, почему возникает эта ошибка.

1 Ответ

0 голосов
/ 05 декабря 2018

С момента написания этого тура, (<>) был перемещен из Monoid в полугруппу, и все экземпляры Monoid также должны быть полугруппами.mappend - это просто синоним (<>).Итак, вам нужно два экземпляра:

instance Semigroup MyMonoid where
  MyMonoid m1 <> MyMonoid m2 = MyMonoid (S.union m1 m2)

instance Monoid MyMonoid where
  mempty = MyMonoid S.empty
...