首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数式编程设置器

函数式编程设置器
EN

Stack Overflow用户
提问于 2014-01-25 00:21:02
回答 2查看 575关注 0票数 3

我怎么在函数式编程中做这样的setter呢?我想尊重不变性和其他函数式编程原则。

代码语言:javascript
复制
private int age;

public void setAge(int age){

this.age=age;

}

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

EN

回答 2

Stack Overflow用户

发布于 2014-01-25 00:38:21

一般来说,您应该创建一个新状态,而不是修改旧状态。

复制

您可以像这样使用copy方法:

代码语言:javascript
复制
case class Person(name: String, age: Int)

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

scalaz镜头

您还可以使用Lens

代码语言:javascript
复制
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,因此您不必手动创建镜头:

代码语言:javascript
复制
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

票数 10
EN

Stack Overflow用户

发布于 2014-01-25 04:31:27

虽然谈论FP赋值函数实际上是一种矛盾的说法,但Scala (作为一种混合的对象-函数语言)确实有一种用于创建赋值函数和类似于赋值函数方法的语法:

代码语言:javascript
复制
scala> class C1 { def x: Int = xx; def x_=(i: Int): Unit = xx = i; private var xx: Int = 0 }
defined class C1

scala> val c1 = new C1
c1: C1 = C1@1e818d28

scala> c1.x = 23
c1.x: Int = 23

scala> c1.x
res18: Int = 23

当然,如图所示,这是没有意义的,但支持命名访问器和赋值函数的不一定是一个简单的字段,而且赋值函数可能会对值施加范围约束,或者在值发生变化时执行一些日志记录,所以这是一个相当通用的构造。

请注意,您不能单独使用赋值函数。它必须有一个对应的访问器。

附录

不变的w/赋值函数w/o case类

代码语言:javascript
复制
scala> class C2(xInit: Int) { def this = this(0)
                              def x: Int = xx
                              def x_=(i: Int): C2 = new C2(i)
                              private var xx: Int = xInit
                            }

scala> val c2a = new C2()
c2a: C2 = C2@2f85040b

scala> val c2b = c2a.x = 23
c2b: C2 = C2@74f1bfa9

scala> c2a.x
res19: Int = 0

scala> c2b.x
res20: Int = 23
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21337474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档