加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 功能编程设置器

发布时间:2020-12-16 10:06:24 所属栏目:安全 来源:网络整理
导读:我怎么能在这样的函数式编程中做一个setter?我想尊重不变性和其他函数式编程原理. private int age;public void setAge(int age){this.age=age;} 那可能吗?如果没有,我如何用函数式编程语言表示程序的状态(及其变化)? 解决方法 通常,您应该创建一个新状态
我怎么能在这样的函数式编程中做一个setter?我想尊重不变性和其他函数式编程原理.

private int age;

public void setAge(int age){

this.age=age;

}

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

解决方法

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

复制

您可以使用这样的复制方法:

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

val youngBob = Person("Bob",15)
val bob = youngBob.copy(age = youngBob.age + 1)
// Person(Bob,16)

斯卡拉兹镜头

你也可以使用镜头:

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的其他实现.

无形镜头

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

import shapeless._

val ageLens = Lens[Person] >> 1

val bob = ageLens.modify(youngBob)(_ + 1)
// Person(Bob,16)

见examples on github.

也可以看看

有许多镜头实现.见Boilerplate-free Functional Lenses for Scala和Macrocosm.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读