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

Scala : EndoMonoids Function composition and Associativity Rules

我正在研究支配幺半群的法则,两条法则中的一条规定追加操作必须是关联的。对于函数组合,这意味着对于给定的所有函数 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 类型的函数都是幺半群?

从你的示例中看不出你声称的内容。

你的例子只是证明了函数组合是不可交换的。但是函数组合从来不应该是可交换的:如果它是可交换的,所有数学和编程都会灾难性地崩溃到计算基本操作的出现次数(也就是说,如果"counting" 本身会以某种方式幸存下来......我不确定这是否可能)。

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

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

对比

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

正如规则(您自己刚刚引用的!)所述。

每组自同态总是一个幺半群,因为类别本质上只是 "monoids with many objects",而幺半群只是 "categories with a single object"。如果您采用 any 类别,然后查看单个对象的自同态,根据定义,您会自动获得一个幺半群。对于普通函数的规范环境 "category" 尤其如此。 [这里应该有一个通常的免责声明,它不是一个真正的类别,在每一种真正的编程语言中,没有什么是真的]