我怎样才能在函数式编程中做一个 setter 呢?我想尊重不变性和其他函数式编程原则。
private int age;
public void setAge(int age){
this.age=age;
}
那可能吗?如果不是,我如何用函数式编程语言表示程序的状态(及其变化)?
最佳答案
一般来说,您应该创建一个新状态而不是修改旧状态。
复制
您可以使用 copy
像这样的方法:
case class Person(name: String, age: Int)
val youngBob = Person("Bob", 15)
val bob = youngBob.copy(age = youngBob.age + 1)
// Person(Bob,16)
斯卡拉兹镜头
您也可以使用
Lens
:import scalaz._, Scalaz._
val ageLens = Lens.lensu[Person, Int]( (p, a) => p.copy(age = a), _.age )
val bob = ageLens.mod(_ + 1, youngBob)
// Person(Bob,16)
见 Learning scalaz/Lens .
Lens
还有其他实现.无形镜片
例如,您可以使用
shapeless
Lens
使用宏实现的,因此您不必手动创建镜头:import shapeless._
val ageLens = Lens[Person] >> 1
val bob = ageLens.modify(youngBob)(_ + 1)
// Person(Bob,16)
见 examples on github .
也可以看看
有很多
Lens
实现。见 Boilerplate-free Functional Lenses for Scala和 Macrocosm .
关于scala - 函数式编程 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337474/