比较中的Monoid实例在哪里定义?

时间:2019-01-03 09:49:04

标签: haskell monoids

newtype Comparison aData.Functor.Contravariant中定义。

contravariant-1.5中定义的此模块的版本中,Monoid上的Contravariant实例定义如下:

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实例被定义为as follows

deriving instance Semigroup (Comparison a)
deriving instance Monoid (Comparison a)

是什么使Monoid (Comparison a)的实例能够自动从基中派生出来?

我应该在哪里看到memptymappend的定义?

2 个答案:

答案 0 :(得分:5)

对于newtype,启用GeneralizedNewtypeDeriving的实例,是使用基础类型的实例获得的。

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

请注意,这最终涉及函数类型b -> cOrdering的半组/单调实例。

答案 1 :(得分:4)

Comparison类型只是newtype上方的a -> a -> Ordering

OrderingSemigroup中定义的GHC.Base实例。

Semigroup的另一个相关实例是:

Semigroup b => Semigroup (a -> b)

也就是说,如果a -> b有一个Semigroup实例,则任何函数类型b都有一个Semigroup实例。

您可以将a -> a -> Ordering视为a -> (a -> Ordering),即以a作为输入并返回(a -> Ordering)作为输出的函数。由于(a -> Ordering)Semigroup实例,因此a -> (a -> Ordering)也是如此。

同一行推理适用于Monoid

最后,正如chi在another answer中所写,GeneralizedNewtypeDeriving将负责其余的工作。

相关问题