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" 尤其如此。 [这里应该有一个通常的免责声明,它不是一个真正的类别,在每一种真正的编程语言中,没有什么是真的]
我正在研究支配幺半群的法则,两条法则中的一条规定追加操作必须是关联的。对于函数组合,这意味着对于给定的所有函数 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" 尤其如此。 [这里应该有一个通常的免责声明,它不是一个真正的类别,在每一种真正的编程语言中,没有什么是真的]