首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个幺半群定律的名字是什么?

这个幺半群定律的名字是什么?
EN

Stack Overflow用户
提问于 2016-09-10 09:10:10
回答 2查看 324关注 0票数 8

Data.Monoid的文档中,它指出应满足以下法律:

代码语言:javascript
复制
mappend mempty x = x
mappend x mempty = x
mappend x (mappend y z) = mappend (mappend x y) z
mconcat = foldr mappend mempty

我对它们的理解是,前2是同一性,第三是结合性。

但是,第四行的法律是什么呢?再次确认身份,但对于mconcat

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-10 09:32:55

从数学上讲,单半群的定义要求存在像memptymappend这样的东西,满足前三个定律:左、右恒等式和结合性。

mconcat方法已经被添加到类中,以反映这样一个事实,即列表中的积累通常是对单列所做的事情。第四条法则是mconcat的可执行规范:实际上,这条法律就是给出mconcat的默认实现的代码行。使mconcat成为类的成员意味着,每个Monoid实例都可以自由地为mconcat提供一个更有效的实现,只要它符合默认值。

在我看来,让mconcat以这种方式重新实现是否是一个特别大的胜利,我还不清楚。我倾向于避免使用mconcat,而倾向于使用(令人困惑的名称) fold

票数 12
EN

Stack Overflow用户

发布于 2016-09-10 14:28:30

mconcat的目的不是提供更多关于单类的信息;它是一个实现细节。这是一个方便的函数,但可能比其默认定义更有效地实现。当考虑无限列表时,“更有效”可以表示“可能”。

考虑Product幺半群。使用mconcat的默认定义,下列操作永远不会终止

代码语言:javascript
复制
mconcat (map Product [0..])

尽管很明显,包含0的任何整数列表都应该生成0。但是,如果要将函数重新定义为

代码语言:javascript
复制
mconcat = foldr (\acc v -> if acc == Product 0 then Product 0 else mappend acc v) empty

那么包含至少一个零的无限列表的乘积仍然会终止。(当然,无限的非零值列表永远不会终止,但是对于包含“早期”零的大型列表,这个mconcat仍然更有效。)

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

https://stackoverflow.com/questions/39424505

复制
相关文章

相似问题

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