haskell - 比较中的 Monoid 实例在哪里定义?
问题描述
newtype Comparison a
中定义Data.Functor.Contravariant
。
在定义的这个模块的版本中contravariant-1.5
,Monoid
实例 onContravariant
定义如下:
instance Monoid (Comparison a) where
mempty = Comparison (\_ _ -> EQ)
mappend (Comparison p) (Comparison q) = Comparison $ mappend p q
Data.Functor.Contravariant
也在 base 中定义(显然,从 GHC 8.6.1 开始)。在基础Monoid
上,实例Comparison
定义如下:
deriving instance Semigroup (Comparison a)
deriving instance Monoid (Comparison a)
是什么使实例能够Monoid (Comparison a)
在基础中自动派生?
我应该在哪里查看它的mempty
定义mappend
?
解决方案
对于newtype
s,GeneralizedNewtypeDeriving
如果启用,则使用底层类型的实例获取实例。
因此,mempty @ a -> a -> Ordering
使用(同上mappend
),然后重新包装为mappend :: Comparison a
.
请注意,这最终涉及函数类型的 semigroup/monoid 实例b -> c
和Ordering
.
推荐阅读
- html - 为什么在我的css网格中最后有额外的网格单元?
- javascript - 在网络服务器上存储和接收 3d 文件的最佳方式
- gnu-parallel - GNU Parallel 中的“--max-args”和“--max-replace-args”之间的区别?
- django - URL 中的“https”但谷歌搜索结果中的“http”
- amazon-web-services - Lambda 调用 update_item,错误:Invalid UpdateExpression:运算符或函数的操作数类型不正确;运算符或函数:+,操作数类型:M
- django - ChoiceFields 在 html 模板和 django 中给出两种不同的形式或不同的字段
- python - 在 Python 中创建数组 N x 1?
- ruby - 如何在 CI 管道中使用 HTMLProofer 检查内部链接?
- linux - 使用 GNU sed 和 GNU find 时如何加速替换?
- node.js - 将订单集合中的订单总和添加到猫鼬中的用户集合