2010-06-24 77 views
22

Scala中的所有不可变数据结构是否持久?如果不是,它们是哪一个,哪一个不是?那些持久的行为特征是什么?另外,它们如何与Clojure中的持久数据结构进行比较?Scala中的持久数据结构

回答

46

Scala的不可变数据结构都是持久的,因为旧值由`update'操作维护。事实上,我不知道永恒和永恒之间的区别。对我来说这两个词是别名。

斯卡拉2.8不可变数据结构中的两个是向量和散列尝试,表示为32元树。这些最初是由Phil Bagwell设计的,他与我在EPFL的团队一起工作,然后被Clojure采用,现在最终被Scala 2.8采用。 Scala实现与Clojure实现共享一个共同的根,但肯定不是它的一个端口。

+20

那么,我的理解是,“持久性”指的是更新不可变值的实现返回一个与原始值共享子结构的值,而不是完成一个完整的克隆。这可以为不可变集合提供接近可变对象的性能 - 您不需要复制10k个旧元素以添加一个新元素。 – 2010-06-24 10:33:56

+2

我不认为数据共享(而不是复制)是通常使用的术语的持久性的先决条件。 (http://en.wikipedia.org/wiki/Persistent_data_structure) – 2010-06-24 19:52:54

+5

我在http://akka.io/docs/akka/1.2/scala/stm.html发现了这一段: “Scala提供了所谓的持久数据结构它使得不可变集合的工作变得快速,它们是不可变的,但是可以随时访问和修改,它们使用结构共享,插入或更新不会破坏旧结构,因此“持久化”。数据结构目前由Map和Vector组成。“ - 根据这个答案我觉得有点不解。我可能只是误解了一些东西。 – 2011-10-31 11:23:46

4

对于问题的最后部分,我记得Rich Hickey在演示中提到Clojure数据结构已经移植到Scala。另外,Michael Fogus提到Scala 2.8计划在this interview中采用一些Clojure的数据结构。

对不起,这是如此短的细节......我不确定上述提到的斯卡拉2.8计划的状态是什么,但我记得瑞奇和迈克尔提到这一点,并认为这可能是一个有趣的事情,让你谷歌如果你有兴趣。

6

List,Vector,HashMap和HashSet在Scala 2.8上都是持久的。还有其他的持久数据结构,但是它们涵盖了所有的主要用途,我不确定列举所有主要用途是否有意义。

+0

这是否意味着HashMap的+方法是O(1)? – 2012-12-02 14:03:19

+2

@MartinKonicek“Effective”O(1),这意味着一些假设必须保持为O(1)。查看集合[性能特征](http://docs.scala-lang.org/overviews/collections/performance-characteristics.html)文档。 – 2012-12-03 01:34:06

+0

谢谢@Daniel C. Sobral! – 2012-12-03 15:04:27