scala - 函数式编程 setter

标签 scala functional-programming setter

我怎样才能在函数式编程中做一个 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 ScalaMacrocosm .

关于scala - 函数式编程 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337474/

相关文章:

python - 如何在 Python 3 中使用过滤器、映射和归约

haskell - 使用 Burstall & Darlington 的折叠/展开系统从线性递归版本派生的尾递归斐波那契数列

scala - 这可能是 Scala 编译器错误吗?

Scala Copy()奇怪的行为

scala - Spark 中两个任务之间的时间间隔

javascript - JavaScript 箭头函数的 raku 等价物是什么?

python - 为类中的所有属性动态创建 @attribute.setter 方法 (Python)

C++11 Setter 函数参数传递 nullptr

java - 通用 setter 方法不兼容类型错误

xml - Scala - 从 xml 中完全删除命名空间