首页 > 解决方案 > 比较中的 Monoid 实例在哪里定义?

问题描述

newtype Comparison a中定义Data.Functor.Contravariant

在定义的这个模块的版本中contravariant-1.5Monoid实例 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

标签: haskellmonoids

解决方案


对于newtypes,GeneralizedNewtypeDeriving如果启用,则使用底层类型的实例获取实例。

因此,mempty @ a -> a -> Ordering使用(同上mappend),然后重新包装为mappend :: Comparison a.

请注意,这最终涉及函数类型的 semigroup/monoid 实例b -> cOrdering.


推荐阅读