【问题标题】:Scala : EndoMonoids Function composition and Associativity RulesScala:EndoMonoids 函数组合和关联规则
【发布时间】:2018-04-02 20:13:03
【问题描述】:

我正在研究管理 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 类型的函数都是幺半群?

【问题讨论】:

    标签: scala scalaz monoids


    【解决方案1】:

    从您的示例中看不到您声称的内容。

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

    为了演示一个关联性的例子,你需要第三个函数h: Int => Int,然后你要比较

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

    对比

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

    完全按照规则(您自己刚刚引用的!)声明。

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

    【讨论】:

    • 谢谢,我对括号的放置感到困惑。通常,括号表示评估事物的顺序。我认为在f.endo |+| (g.endo |+| h.endo) 的情况下,首先评估括号内的函数,因此在上述情况下,它将是f(g(h(x))(f.endo |+| g.endo ) |+| h.endo,其中它会被评估为h(f(g(x))),但我现在相信括号没有意义,因为函数的append 规则是 f compose g compose h ,无论括号放在哪里。请指教。
    • @jjayadeep 方括号根本没有说明评估。它们只强制执行运算符优先级。括号中的内容是否被评估是一个单独的问题。例如,如果您评估true || (true && {println("Hey!"); true}),则根本不会评估括号中的内容。在您的问题中,f o (g o h) 表示先组合gh,然后再组合f(g o h)。同样,(f o g) o h 表示:fg 先组合,然后(f o g)h 组合。关联性意味着:这两件事本质上是相同的。
    猜你喜欢
    • 2012-03-04
    • 2011-07-26
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多