基本的Monoid定义给出“没有实例实例声明的超类引起的(Semigroup MyMonoid)实例". [英] A basic Monoid definition gives "No instance for (Semigroup MyMonoid) arising from the superclasses of an instance declaration"

查看:92
本文介绍了基本的Monoid定义给出“没有实例实例声明的超类引起的(Semigroup MyMonoid)实例".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将联合操作的Haskell整数集定义为 Monoid .

I am attempting to define Haskell integer sets with the union operation as a 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’

我做错了什么?这似乎很简单,我正在复制在,但我看不到为什么会发生此错误.

What am I doing wrong? This seems so simple, and I'm copying the syntax I see in examples like this, but I can't see why this error is occurring.

推荐答案

自编写导览以来,(<>)已从Monoid移到Semigroup,并且所有Monoid实例也必须也是Semigroup. mappend只是(<>)的同义词.因此,您需要两个实例:

Since that tour was written, (<>) has been moved from Monoid to Semigroup, and all Monoid instances are required to also be Semigroup. mappend is just a synonym for (<>). So, you need two instances:

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

instance Monoid MyMonoid where
  mempty = MyMonoid S.empty

这篇关于基本的Monoid定义给出“没有实例实例声明的超类引起的(Semigroup MyMonoid)实例".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆