gpt4 book ai didi

Scala 惰性集合增长

转载 作者:行者123 更新时间:2023-12-04 05:07:22 27 4
gpt4 key购买 nike

这个问题有点理论化。
我有一个对象,其中包含一个私有(private)可变列表或映射,其增长仅是附加的。我相信我可以争辩说对象本身是功能性的,在功能上是透明的,并且对于所有外观而言,是不可变的。所以例如我有

import scala.collection.mutable.Map

case class Foo(bar:String)

object FooContainer {
private val foos = Map.empty[String, Foo]

def getFoo(fooName:String) = foos.getOrElseUpdate(fooName, Foo(fooName))
}

我可以用列表做一个类似的案例。现在我想象要真正发挥功能,我需要确保线程安全,我想我可以简单地使用锁、同步或原子引用来做到这一点。我的问题是这一切都是必要的和充分的,这是一种常见的做法,这种行为是否有既定的模式?

最佳答案

我会说“功能”确实是错误的术语。上面显示的确切示例可以称为“纯”,因为它的输出仅由其输入定义,因此没有任何(可见的)副作用。但实际上它是不纯的,因为它具有隐藏的内部状态。

The function always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change as program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices. Wikipedia



但是,如果您制作 Foo,那么明显的杂质就会消失。类可变:
case class Foo(bar:String) {
private var mutable:Int = 1
def setFoo(x:Int) = mutable = x
def foo = mutable
}
Foo 的可变性类结果 getFoo不纯:
scala> FooContainer.getFoo("test").foo
res5: Int = 1

scala> FooContainer.getFoo("bla").setFoo(5)

scala> FooContainer.getFoo("bla").foo
res7: Int = 5

为了使函数看起来很纯粹, FooContainer.getFoo("bla").foo必须始终返回相同的值。因此,所描述的构造的“纯度”充其量是脆弱的。

关于Scala 惰性集合增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15359561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com