功能编程设置器

Rod*_*mez 3 setter functional-programming scala

我怎么能在这样的函数式编程中做一个setter?我想尊重不变性和其他函数式编程原理.

private int age;

public void setAge(int age){

this.age=age;

}
Run Code Online (Sandbox Code Playgroud)

那可能吗?如果没有,我如何用函数式编程语言表示程序的状态(及其变化)?

sen*_*nia 10

通常,您应该创建一个新状态而不是修改旧状态.

复制

你可以使用这样的copy方法:

case class Person(name: String, age: Int)

val youngBob = Person("Bob", 15)
val bob = youngBob.copy(age = youngBob.age + 1)
// Person(Bob,16)
Run Code Online (Sandbox Code Playgroud)

斯卡拉兹镜头

你也可以使用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)
Run Code Online (Sandbox Code Playgroud)

请参阅学习scalaz /镜头.还有其他实现Lens.

无形镜头

例如,您可以使用shapeless Lens使用宏实现的,因此您不必手动创建镜头:

import shapeless._

val ageLens = Lens[Person] >> 1

val bob = ageLens.modify(youngBob)(_ + 1)
// Person(Bob,16)
Run Code Online (Sandbox Code Playgroud)

请参阅github上的示例.

也可以看看

有很多Lens实现.请参阅Scala和Macrocosm 的无Boilerplate功能镜头.