Scala:EndoMonoids函数组合和关联性规则

时间:2018-04-02 20:13:03

标签: scala scalaz monoids

我正在审查管理Monoids的法律,其中一条法律规定追加行动必须是联合的。对于函数组合,这意味着对于所有函数X->X,给出了3个函数f,g和h (f∘g)∘h=f∘(g∘h)

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

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类型的所有函数都是幺半群?

1 个答案:

答案 0 :(得分:0)

您所声称的内容无法从您的示例中看到。

您的示例仅证明函数组合不是可交换的。但是函数组合从来不应该是可交换的:如果它是可交换的,那么所有的数学和编程都会灾难性地崩溃,以便计算基本操作的发生次数(也就是说,如果“计算”本身会以某种方式存活那...我不确定是否可能。)

要演示关联性的示例,您需要第三个函数h: Int => Int,然后您必须比较

 (f.endo |+| g.endo) |+| h.endo

VS

 f.endo |+| (g.endo |+| h.endo)

完全符合规则(你自己刚刚引用!)说明。

每一组内同胚总是一个幺半群,因为类别基本上只是“具有许多物体的幺半群”,而幺半群只是“具有单个物体的类别”。如果您使用任何类别然后查看单个对象的内同态,则根据定义,您将自动获得一个幺半群。对于普通函数的规范环境“类别”尤其如此。 [这应该是通常的免责声明,它不是真正的类别,并且在每种真正的编程语言中都没有真正的真实]