ユニオン演算を使って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 などの例にある構文をコピーしていますが、このエラーが発生している理由がわかりません。
そのツアーが作成されて以来、(<>)
は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