【问题标题】:Updating large data structures in idiomatic Scala在惯用的 Scala 中更新大型数据结构
【发布时间】:2014-03-07 18:54:37
【问题描述】:

我已经用 Scala 试验了一段时间,并且经常遇到支持不可变数据结构的建议。

但是当你有一个数据结构时,例如3D 场景图、大型神经网络或任何需要频繁更新的对象(动画场景中的对象、训练神经网络……),这似乎是

  1. 运行时效率极低,因为您需要不断地重新创建整个对象图,并且

  2. 难以编程,因为当您引用一些需要更新的对象时,您不能只调用它们的 setter,而是需要复制对象图并用更新的对象替换旧对象。

在惯用的 Scala 中如何处理这些事情?

【问题讨论】:

  • 1.不可变数据结构通常允许在不复制整个数据的情况下进行更新。 2. 你听说过镜头吗? (可能相关:stackoverflow.com/questions/3900307/…
  • @GáborBakos 1. 实际上,这样的结构是不可变数据结构的子集,被命名为persistent 并且一些内置的 scala 集合是持久的(例如 List) 2. 即使镜头是一根魔杖, 没有正确的拼写 use lens 是有点无用的提示
  • @om-nom-nom 感谢您的评论。我希望堆栈溢出链接提供了如何使用镜头的想法。老实说,我很好奇这些镜片对她/他不起作用,或者只是不为人知。我希望我的评论没有冒犯性,在这种情况下我道歉。
  • 没有冒犯,没有冒犯,只是注意到镜头是一种更容易更新嵌套结构的方法,但对于图形,仍然可能 i> 很笨拙
  • @GáborBakos 我听说过 lensens,但是 1) 希望这种相当普遍的情况不需要也依赖于宏的(相当复杂的)解决方案 2) 认为对于图形结构,它们对第二个问题没有多大帮助,3)认为他们对第一个问题根本没有帮助。另外,当然我知道不可变数据结构不需要完整的深拷贝,但至少您需要为要更新的对象以及引用其中一个的每个对象创建新对象,依此类推。否则它们就不会真正是不可变的。

标签: scala data-structures immutability


【解决方案1】:

Scala 是多范式:OO 和函数式、可变和不可变。

复杂图是数据结构的一个例子,正如您所指出的,它可能更容易在可变上下文中使用。如果是这样,使数据结构可变。

惯用的 Scala 是使用正确的范例来解决您的问题。

【讨论】:

  • 那么问题是如何找到正确的范式。真的像“不变性似乎让事情变得太困难,我将退回到可变数据结构”那么简单吗?我刚刚找到stackoverflow.com/questions/9891522,其中有一个答案提到了图结构不一定需要直接表示为对象图(其中连接由对象之间的引用表示)的想法。实际上,如果一条边只是 Set 中的一个对象,并引用了 2 个节点,那么更新它只是意味着替换 Set 中的那个对象。
  • @herman - 任何难以更新的不可变对象都可以替换为具有唯一 ID 的独立对象云以及存储在不可变集中的所有实际指针。有时这很有帮助。有时这是一个大头痛,没有额外的好处。这实际上取决于细节。 仅仅是,如果不变性太难(或太慢),您应该退回到可变性,而是这样做的正当理由,尤其是当您不需要不变性可以提供的优势时(除了基线“更难射中自己的脚”优势)。
猜你喜欢
  • 2021-11-23
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2012-05-31
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多