首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“Control.Applicative.Const”没有“可选”实例

为什么“Control.Applicative.Const”没有“可选”实例
EN

Stack Overflow用户
提问于 2015-02-23 18:56:55
回答 1查看 517关注 0票数 16

有一个实例Monoid a => Monoid (Const a b)用于来自Control.ApplicativeConst函子。还有一个实例Monoid m => Applicative (Const m)

因此,我希望也有一个实例Monoid m => Alternative (Const m)Monoid的实例相吻合。这只是一个应该纠正的遗漏,还是有更深层次的原因?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 08:15:04

我相信还有更深层次的原因。虽然Alternative似乎没有规范的规则集,但是为了使Alternative有意义,Alternative和它的Applicative操作之间肯定应该有一种关系(否则它只是一个任意的单子)。

This answer to Confused by the meaning of the 'Alternative' type class and its relationship to other type classes声明了这些法律

  1. <*>**):*‘(f <|> g) <> a=(f <> a) <|> (g <> a)’‘
  2. 右吸收(用于<*>**):*‘ <> a=空)
  3. ( fmap**):** f <$> (a <|> b) = (f <$> a) <|> (f <$> b)的)左分布
  4. fmap**):** 左吸收( f <$> empty = empty )

这对我来说很有意义。粗略地说,empty<|>对于pure<$>/<*>就像0和+对于1和*一样。

现在,如果我们添加与Monoid / Applicative的实例相同的实例,那么正确的法律就不成立了。

例如,2失败,因为

代码语言:javascript
复制
empty <*> (Const x)
= Const mempty <*> Const x    -- by the suggested definition of Alternative
= Const $ mempty `mappend` x  -- by the definition of <*> for COnst
= Const x                     -- by monoid laws

这不等于empty = Const mempty。类似地,1失败,一个简单的反示例就是设置f = Const (Sum 1); g = Const (Sum 1) ; a = Const (Sum 1)

另请参阅:

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

https://stackoverflow.com/questions/28681260

复制
相关文章

相似问题

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