我正在研究管理Monoids的法则,其中一条法则规定附加操作必须是关联的。对于函数组合,这意味着对于给定的所有函数X->X,都有3个函数f、g和h (f∘g)∘h=f∘(g∘h)。
在scalaz中,我看到有一个名为EndoMonoid的类型,它使用compose作为附加,这与正常函数组合的工作方式不同。
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类型的所有函数都是单半群?
发布于 2018-04-02 20:25:53
从你的例子看不出你声称的是什么。
你的例子只证明了函数组合不是可交换的。但是函数组合从来不应该是可交换的:如果它是可交换的,那么所有的数学和编程都会灾难性地崩溃到计算基本操作发生的次数(也就是说,如果“计数”本身能在某种程度上幸存下来……我不确定这是否可能)。
为了演示一个结合性的例子,您需要第三个函数h: Int => Int,然后您必须进行比较
(f.endo |+| g.endo) |+| h.endo与
f.endo |+| (g.endo |+| h.endo)就像你刚才引用的规则一样!州。
每一组自同态都是一元的,因为范畴本质上只是“有多个对象的一元”,而单列只是“单对象的范畴”。如果你接受任何类别,然后查看单个对象的自同态,你就会自动地,根据定义,得到一个单样体。对于普通函数的标准环境“类别”来说,这是特别正确的。这里应该有一个通常的免责声明,即它不是一个真正的类别,而且在每一种真正的编程语言中,没有什么是真的
https://stackoverflow.com/questions/49618144
复制相似问题