【问题标题】:How to model changing state in functional programming如何在函数式编程中对变化状态进行建模
【发布时间】:2015-10-27 09:33:06
【问题描述】:

我是 FP 和 Scala 的新手,我有一个关于如何以函数式方式有效解决问题的问题。

假设我有:

case class Store(storedObjects: List[StoreObject])

case class StoreObject(name: String)

我想将所有StoreObjects 存储在Store 中。

List 不可变时,我如何将新的 StoreObjects 添加到 Store case class 拥有的 List

举第二个例子:假设我有一个case class Person,如下所示,

case class Person(name: String) 和一个名为object PersonController的对象

它拥有一个不可变的Persons 列表,每次我创建一个新的Person 时,我都想将它添加到PersonController 的列表中。

有没有办法在 fp 或模式中做到这一点?

或者切换到可变性是做这种事情的唯一有效方法(由于多线程,这会很痛苦)。

感谢您的帮助 六边形

【问题讨论】:

    标签: list scala object functional-programming immutability


    【解决方案1】:

    我认为您现在缺少的主要想法是完全发生变异但实际上使用添加/删除操作的结果创建一个新对象的可能性。

    为了添加......例如:

    def add(sObject: StoreObject, store: Store) = store.copy(storedObjects = store.storedObjects :+ sObject)

    这将返回一个新的Store 保存列表。

    希望这是有道理的,并回答您的疑问。

    【讨论】:

    • 感谢您的帮助 如果列表非常大,这不是非常低效吗?以及如何在我提到的 PersonController 对象上执行这种“模式”?
    【解决方案2】:

    如何将新的 StoreObjects 添加到 Store 类拥有的列表中

    用字段定义一个常规类

    var list = List()  
    

    val list = mutable.List()
    

    您可以在两种情况下更改此字段:在第一种情况下,通过重新分配 var,在第二种情况下,通过改变底层 mutable.List

    我更喜欢第一种方式 - var 带有不可变列表,因为您可以安全地在线程之间共享它。但是您必须确保list 上的更新操作正确同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2022-08-13
      • 2021-10-22
      • 1970-01-01
      • 2011-11-16
      • 2015-04-17
      相关资源
      最近更新 更多