我正在审查管理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
类型的所有函数都是幺半群?
答案 0 :(得分:0)
您所声称的内容无法从您的示例中看到。
您的示例仅证明函数组合不是可交换的。但是函数组合从来不应该是可交换的:如果它是可交换的,那么所有的数学和编程都会灾难性地崩溃,以便计算基本操作的发生次数(也就是说,如果“计算”本身会以某种方式存活那...我不确定是否可能。)
要演示关联性的示例,您需要第三个函数h: Int => Int
,然后您必须比较
(f.endo |+| g.endo) |+| h.endo
VS
f.endo |+| (g.endo |+| h.endo)
完全符合规则(你自己刚刚引用!)说明。
每一组内同胚总是一个幺半群,因为类别基本上只是“具有许多物体的幺半群”,而幺半群只是“具有单个物体的类别”。如果您使用任何类别然后查看单个对象的内同态,则根据定义,您将自动获得一个幺半群。对于普通函数的规范环境“类别”尤其如此。 [这应该是通常的免责声明,它不是真正的类别,并且在每种真正的编程语言中都没有真正的真实]