【发布时间】:2016-07-18 19:32:22
【问题描述】:
Scala 中纯函数的准确定义是什么?纯函数在 wiki https://en.wikipedia.org/wiki/Pure_function 上有一个定义。我认为这个定义是针对纯函数式编程语言的。
但是,我认为它在类方法和闭包的上下文中变得复杂。
class Ave(val a: Int, val b: Int) {
def ave = (a+b)/2
}
ave 是纯函数吗?我认为是,因为它没有副作用,并且只取决于类的不可变状态。但这实际上违反了 wiki 上的纯函数定义,即纯函数通常不应该访问非局部变量。
关于关闭的类似问题:
def fcn(a:Int, b: Int): Unit = {
def ave = (a+b) / 2
}
对我来说,两个 ave 都是纯函数,相当于一个“val”(统一访问原则)。
但是如何严格证明呢?此外,如果 a 和 b 字段是可变的,则 ave 不再是纯函数式的。
class Ave2(var a: Int, var b: Int) {
def ave = (a+b)/2 // Not pure functional
}
纯函数的另一种定义来自《Scala 中的函数编程》一书:
如果对于所有程序 p,表达式 e 是引用透明的, p 中所有出现的 e 都可以替换为求值结果 e 不影响 p 的含义。一个函数 f 是纯的,如果 表达式 f(x) 对所有引用透明的 透明x
那么问题是,对于一个类,一个类中的可变状态是否具有引用透明性(在我的示例中为 var a, var b)? (如果是,那么Ave2中的ave方法就变成了纯函数,这是矛盾的)
Scala 中纯函数的准确定义是什么?
【问题讨论】:
标签: scala functional-programming