首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala : EndoMonoids函数的合成和结合规则

Scala : EndoMonoids函数的合成和结合规则
EN

Stack Overflow用户
提问于 2018-04-02 20:13:03
回答 1查看 211关注 0票数 0

我正在研究管理Monoids的法则,其中一条法则规定附加操作必须是关联的。对于函数组合,这意味着对于给定的所有函数X->X,都有3个函数f、g和h (f∘g)∘h=f∘(g∘h)

在scalaz中,我看到有一个名为EndoMonoid的类型,它使用compose作为附加,这与正常函数组合的工作方式不同。

代码语言:javascript
复制
val f : Int => Int = x => x*x 
val g : Int => Int = y => y + 1 

val e = f.endo |+| g.endo
val d = g.endo |+| f.endo

e run 10
Int = 121

d run 10
Int = 101

从以上结果可以看出,函数不满足结合性质。这是否意味着不是X -> X类型的所有函数都是单半群?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 20:25:53

从你的例子看不出你声称的是什么。

你的例子只证明了函数组合不是可交换的。但是函数组合从来不应该是可交换的:如果它是可交换的,那么所有的数学和编程都会灾难性地崩溃到计算基本操作发生的次数(也就是说,如果“计数”本身能在某种程度上幸存下来……我不确定这是否可能)。

为了演示一个结合性的例子,您需要第三个函数h: Int => Int,然后您必须进行比较

代码语言:javascript
复制
 (f.endo |+| g.endo) |+| h.endo

代码语言:javascript
复制
 f.endo |+| (g.endo |+| h.endo)

就像你刚才引用的规则一样!州。

每一组自同态都是一元的,因为范畴本质上只是“有多个对象的一元”,而单列只是“单对象的范畴”。如果你接受任何类别,然后查看单个对象的自同态,你就会自动地,根据定义,得到一个单样体。对于普通函数的标准环境“类别”来说,这是特别正确的。这里应该有一个通常的免责声明,即它不是一个真正的类别,而且在每一种真正的编程语言中,没有什么是真的

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

https://stackoverflow.com/questions/49618144

复制
相关文章

相似问题

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