gpt4 book ai didi

scala - 管理可变状态的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 18:46:18 25 4
gpt4 key购买 nike

我刚刚在 Coursera 上完成了 Martin Odersky 的 scala 类(class)。 Scala 是我的第一个 FP 语言,我对限制可变状态的想法感到兴奋。这允许更容易的并发性,也使代码 super 可维护。

在学习所有这些的过程中,我意识到你可以保证一个对象的可变性,只要它没有可变变量并且只引用不可变对象(immutable对象)。所以现在我可以通过创建新状态而不是修改旧状态来做所有事情,尽可能使用尾递归。

伟大的。所以我只能做到这一点。在某些时候,我的应用程序需要能够修改一些现有状态。我知道此时在哪里进行并发控制,锁,等等。我仍然默认使用我一直使用的标准多线程并发控制。

哦scala社区,有更好的方法吗?也许是单子(monad)?

编辑:这个问题有点笼统,所以我想给出一个用例:
我有一个机器学习算法,可以存储多个数据集合。它们具有返回数据(训练等)的更新表示的函数,所有这些都是不可变的。最终,我可以保持这种返回更新状态模式沿着链向上运行到运行模拟的实际对象。这具有可变的状态并保存对集合的引用。我可能想分发到多核或多系统。

最佳答案

这是一个有点主观的问题,所以我不会试图回答其中的“哪个是最好的”部分。如果您主要关心的是多线程并发上下文中的状态,那么一个选项可能是 Software Transactional Memory .

有一个Implementation Akka 提供的 STM (参见快速入门) .根据您的用例,它可能是重量级的或矫枉过正的,但话又说回来,它可能比一堆锁更可取。与锁不同,STM 倾向于乐观,就像数据库事务一样。与数据库事务一样,您在事务上下文中显式更改共享状态,并且您描述的更改将自动提交或在检测到冲突时重新尝试。基本上,您必须将所有状态包装在 Refs 中,这些状态只能在“原子” block 中进行操作 - 实现为采用闭包的方法,您可以在其中使用操作 Ref s 和 ScalaSTM 确保对您的状态的整个操作集成功或失败 - 不会有中途或不一致的更改。

这利用了 Scala 的隐式参数 - 所有操作到 Ref s 需要一个事务对象作为参数,这由给 atomic 的闭包接收。并且可以声明为隐式,所以atomic中的所有代码will 可以写成非常自然而安全的风格。

要做到这一点,您需要使用提供的事务数据结构;所以这意味着使用 TSet而不是 Set , TMap而不是 Map .当在事务上下文(在原子 block 内)中使用时,它们提供全有或全无的更新语义。这很像 clojure 的持久化集合。您还可以使用 Ref 构建自己的事务数据结构。用于这些 atomic block 。

如果你不反感括号的话,对 refs 的 clojure 解释真的很好:http://clojure.org/refs

关于scala - 管理可变状态的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803843/

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