繁体   English   中英

一个基本的 Monoid 定义给出了“(Semigroup MyMonoid) 没有由实例声明的超类产生的实例”

[英]A basic Monoid definition gives "No instance for (Semigroup MyMonoid) arising from the superclasses of an instance declaration"

我试图用联合操作将 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’

我究竟做错了什么? 这看起来很简单,我复制的语法我像例子中看到这个,但我不明白为什么这个错误发生。

自从写完那篇游记以来, (<>)已经从 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM