首页 > 解决方案 > 无法从实例声明的超类中推断出(半群(可选 a))

问题描述

“Haskell Programming: From first principle”中的以下代码无法编译:

module Learn where
import Data.Semigroup
import Data.Monoid

-- Exercise: Optional Monoid
data Optional a = Nada
                | Only a
                deriving (Eq, Show)

instance Monoid a => Monoid (Optional a) where
 mempty = Nada
 mappend Nada Nada = Nada
 mappend (Only a) Nada = Only $ mappend a mempty
 mappend Nada (Only a) = Only $ mappend mempty a
 mappend (Only a) (Only b) = Only $ mappend a b

它给出了以下错误:

intermission.hs:11:10: error:
    • Could not deduce (Semigroup (Optional a))
        arising from the superclasses of an instance declaration
      from the context: Monoid a
        bound by the instance declaration at intermission.hs:11:10-40
    • In the instance declaration for ‘Monoid (Optional a)’
   |
11 | instance Monoid a => Monoid (Optional a) where
   |   

为了阻止 ghc 抱怨,我必须创建 Optional a 的半群实例并定义“<>”。这对我来说不太有意义,我想知道我是否忽略了一些东西。

标签: haskell

解决方案


"注意:Semigroup 自 base-4.11.0.0 以来是 Monoid 的超类。 "

中的超类列表一直在缓慢发展。随着新的有用类的提出,旧类的 API 会更新以反映它们的关系。这具有破坏旧代码的不幸影响。Base 4.11.1.0 于 2018 年 4 月发布,对 Monoid 进行了重大更改。


推荐阅读