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功能镜头.