haskell - 无法从实例声明的超类中推断出(半群(可选 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 的半群实例并定义“<>”。这对我来说不太有意义,我想知道我是否忽略了一些东西。
解决方案
"注意:Semigroup 自 base-4.11.0.0 以来是 Monoid 的超类。 "
中的超类列表一直在缓慢发展。随着新的有用类的提出,旧类的 API 会更新以反映它们的关系。这具有破坏旧代码的不幸影响。Base 4.11.1.0 于 2018 年 4 月发布,对 Monoid 进行了重大更改。
推荐阅读
- node.js - 我们可以在MongoDB的对象集合中插入数据吗
- angular - 如何解决这个问题(“this.http.post(...).map(...).concatMap 不是函数”)?
- java - 如何在android应用程序中集成大地水准面模型计算?
- mysql - 数据库升级建议
- html - 如何使用百里香从 html 中获取数据?
- c++ - 判断哪些线程已终止的有效方法
- mysql - MySQL 存储过程游标示例
- javascript - 角度对象数组值抛出未定义的错误
- bash - /usr/bin/bash: -c: line 20: 在使用 make 命令安装 sphinxbase 时出现意外标记 `(' 附近的语法错误
- python - 从列表中删除重复的字典并减去重复元素的键值