web-dev-qa-db-ja.com

基本的なモノイド定義は、「インスタンス宣言のスーパークラスから発生する(Semigroup MyMonoid)のインスタンスはありません」を示します。

ユニオン演算を使って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)

エラーが出る

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

何が悪いのですか?これは非常に単純なようで、 this などの例にある構文をコピーしていますが、このエラーが発生している理由がわかりません。

17
W.P. McNeill

そのツアーが作成されて以来、(<>)はMonoidからSemigroupに移動され、すべてのMonoidインスタンスもSemigroupである必要があります。 mappend(<>)の同義語です。したがって、2つのインスタンスが必要です。

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

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