Fre*_*ind 0 functional-programming scala
在"Scala中的函数式编程"一书中,它提供了一些关于副作用的例子,例如:
我的问题是,从外部读取一些数据比参数使函数不纯?
例如
val name = "Scala"
def upcase() = name.toUpperCase
Run Code Online (Sandbox Code Playgroud)
upcase功能是否纯净?
编辑:根据这个答案:https://stackoverflow.com/a/31377452/342235,我的"函数"实际上不是函数,它是一个方法,所以我给它一个函数版本,并问同样的问题:
val name = "Scala"
val upcase: () => String = () => name.toUpperCase
Run Code Online (Sandbox Code Playgroud)
从不可变数据中读取并不是不纯的; 该函数每次仍会返回相同的值.如果name是var那么那个函数将是不纯的,因为外部的东西可能会改变name,所以多次调用upcase()可能会评估为不同的值.
(当然,也许有可能name通过反思来改变.正确地说,我们只能谈论关于什么样的功能被允许称为给定功能的某种概念的纯度,以及我们认为等同的哪种副作用)
值得注意的是,你的功能并不纯粹,因为toUpperCase它不纯粹; 它取决于系统的默认区域设置,并可能在不同的系统上产生不同的结果(例如在土耳其系统上"i".toUpperCase == "?").你应该总是通过一个明确的Locale,例如def upcase() = name.toUpperCase(Locale.ENGLISH); 然后功能将是纯粹的.