首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里定义比较中的Monoid实例?

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

Stack Overflow用户
提问于 2019-01-03 17:49:04
回答 2查看 109关注 0票数 3

Data.Functor.Contravariant中定义了newtype Comparison a

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

代码语言:javascript
复制
instance Monoid (Comparison a) where
  mempty = Comparison (\_ _ -> EQ)
  mappend (Comparison p) (Comparison q) = Comparison $ mappend p q

在base中也定义了Data.Functor.Contravariant (显然是从GHC8.6.1开始)。在base中,Comparison上的Monoid实例定义为as follows

代码语言:javascript
复制
deriving instance Semigroup (Comparison a)
deriving instance Monoid (Comparison a)

什么使Monoid (Comparison a)实例能够自动派生到base?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-03 18:05:25

对于启用了GeneralizedNewtypeDerivingnewtype,实例是使用基础类型的实例获取的。

因此,使用了mempty @ a -> a -> Ordering (mappend的情况也是如此),然后重新包装为mappend :: Comparison a

请注意,这最终涉及到函数类型b -> cOrdering的半群/么半群实例。

票数 5
EN

Stack Overflow用户

发布于 2019-01-03 18:07:46

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

我认为Ordering是在GHC.Base中定义的Semigroup实例。

Semigroup的另一个相关实例是:

代码语言:javascript
复制
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会处理剩下的事情。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54019789

复制
相关文章

相似问题

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