Scala 在一些关于函数编程的书中,实例方法委托给在伴随对象中定义的二进制函数。有什么实际原因吗?

Scala 在一些关于函数编程的书中,实例方法委托给在伴随对象中定义的二进制函数。有什么实际原因吗?,scala,functional-programming,Scala,Functional Programming,我经常看到: class A { def operation(b: B) = A.operation(a,b) } object A { def operation(a: A, b: B) = /* impl */ } 而不仅仅是: class A { def operation(b: B) = /* impl */ } object A { def operation(a: A, b: B) = a.operation(b) } 甚至只是: class A { def operation(

我经常看到:

class A { def operation(b: B) = A.operation(a,b) }
object A { def operation(a: A, b: B) = /* impl */ }
而不仅仅是:

class A { def operation(b: B) = /* impl */ }
object A { def operation(a: A, b: B) = a.operation(b) }
甚至只是:

class A { def operation(b: B) = /* impl */ }
主要是在函数式编程方面的书籍中,但我在我们的产品代码中也见过几次这种模式。同时,
operation
在几乎中从未被称为
A.operation(A,b)
——相反,它总是
A.operation(b)
A operation b
,这是有意义的,因为中缀符号(也许可以说)更可读


如果您从未使用过它,为什么首先要在伴生对象中定义方法?你为什么要授权给它?这有什么实际的原因吗?或者这仅仅是某种“每个人都从X开始做,所以我们也可以做?”

Imo,主要的原因是
def操作(a:a,b:b)=???
可以并且应该实现为a,这个语义与
类a{def操作(b:b)相比更清楚地表明了这一点}

最后一种是面向对象的方法。而且,如果熟悉OOP,它可能会改变
A
的状态,从而产生副作用


因此,这一切都表明实现没有副作用。

我不知道有任何Scala实现,甚至没有任何基于类的OO语言的实现,在每个对象中复制方法,而不是将它们保留在类中。毕竟,这基本上就是类存在的全部原因。可能
A.operation
甚至是私有的。其想法可能是构建纯函数并提供类似方法的语法。在任何情况下,除了风格之外,没有任何理由选择一种而不是另一种。注:GADTs有时有一个模式匹配的gatch,只有在类外完成时才有效。