【问题标题】:A basic Monoid definition gives "No instance for (Semigroup MyMonoid) arising from the superclasses of an instance declaration"一个基本的 Monoid 定义给出了“没有由实例声明的超类产生的 (Semigroup MyMonoid) 实例”
【发布时间】:2019-05-06 10:33:11
【问题描述】:

我正在尝试使用联合操作将 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 之类的示例中看到的语法,但我不明白为什么会出现这个错误。

【问题讨论】:

    标签: haskell monoids


    【解决方案1】:

    自从编写了该巡演后,(<>) 已从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2010-10-30
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多