在函数式编程术语中,如果我执行:
val a = new Client
val b = new Client
调用上面的构造函数两次被认为是纯函数还是非纯函数?
答案 0 :(得分:6)
如果你可以用以下两行代替:
val a = new Client
val b = a
在不改变整个程序行为的情况下,对象实例化可以被认为是纯粹的(referential transparency)。
如果Client
构造函数具有任何“可观察的”副作用,或者您在程序中使用了标识相等性,它将失败。
答案 1 :(得分:4)
通常,内存分配不被认为是副作用,因此构造函数调用本身被认为是纯粹的。
虽然它最终可能会导致程序内存不足,但这并不是你可以作为程序员真正控制的东西,所以“纯度”通常被认为是在无限内存的假设下。
如果你的构造函数本身有副作用,那么调用它就不会是纯粹的。