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

Col*_*sey 5 scala

我刚刚在Coursera完成了Martin Odersky的scala课程.Scala是我的第一个FP语言,我对限制可变状态的想法很兴奋.这允许更容易的并发性并且还使代码超级可维护.

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

大.所以我到目前为止只能做到这一点.在某些时候,我的应用程序需要能够修改一些现有的状态.我知道在这一点上放入并发控制的地方,锁定,等等等等.我仍然默认使用我一直使用的标准多线程并发控制.

哦斯卡拉社区,还有更好的方法吗?莫纳德也许?

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

Mal*_*off 2

根据您的用例,您可能能够坚持使用部分复制的深度不可变对象结构,而不是实际改变它们(类似于与其原始列表共享后缀的“更新的”不可变列表)。所谓的透镜是处理此类结构的好方法,请在这个 SO 问题这篇博客文章中阅读有关它们的内容。

当然,只有当您不希望全局可观察到更改时,坚持不可变的结构才有效。不可变结构很可能不可行的一个例子是两个并发客户端在共享列表上工作,其中客户端 A 所做的修改必须可由客户端 B 观察到,反之亦然。