首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从实例声明的超类中推导出(Semigroup (Optional a))

无法从实例声明的超类中推导出(Semigroup (Optional a))
EN

Stack Overflow用户
提问于 2018-09-09 01:51:27
回答 2查看 2.4K关注 0票数 18

"Haskell Programming: from first principles“中的以下代码无法编译:

代码语言:javascript
复制
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

它会给出以下错误:

代码语言:javascript
复制
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的抱怨,我不得不创建一个可选a的半群实例,并定义"<>“。这对我来说不太合理,我想知道我是不是忽略了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-09 02:04:40

"NOTE: Semigroup is a superclass of Monoid since base-4.11.0.0.

中的超类列表一直在缓慢演变。随着新的有用类的提出,旧类的API会更新以反映它们之间的关系。这会带来破坏旧代码的不幸后果。Base 4.11.1.0于2018年4月发布,对Monoid进行了这一突破性的更改。

票数 18
EN

Stack Overflow用户

发布于 2018-12-16 17:33:15

以下是解决方案:

代码语言:javascript
复制
import Data.Monoid

data Optional a = Nada | Only a deriving (Eq, Show)

instance Monoid a => Monoid (Optional a) where
   mempty = Nada

instance Semigroup a => Semigroup (Optional a) where
  Nada <> (Only a) = Only a
  (Only a) <> Nada = Only a
  (Only a) <> (Only a') = Only (a <> a')
  Nada <> Nada = Nada

main :: IO ()
main = do
  print $ Only (Sum 1) `mappend` Only (Sum 1)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52237895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档