Does Elixir have persistent data structures similar to Clojure?

时间:2015-05-12 23:38:23

标签: clojure elixir

Are all immutable data structures in Elixir persistent? If not, which of them are and which not? Also, how do they compare to the persistent data structures in Clojure?

1 个答案:

答案 0 :(得分:23)

是的,大多数都是持久性数据结构。

例如,Elixir列表是链表,链表是退化树(它只有一个分支):

Elixir: list = [1, 2, 3, 4]
Tree:   1 -> 2 -> 3 -> 4

每次将一个元素添加到列表中时,它都会分享它的尾部:

Elixir: [0|list]
Tree:   0 -> (1 -> 2 -> 3 -> 4)

Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,并且实际上是树。 There is some write up on Joseph's blog

地图也是持久性数据结构,它们非常有趣,因为它们的表示会根据键的数量而变化。当你有小地图时,请说:

%{:foo => 1, :bar => 2, :baz => 3}

表示为:

        -------------(:foo, :bar, :baz)
        |
(map, keys, values)
               |
               ------(1, 2, 3)

因此,每次更新一个密钥时,我们都会共享"密钥"存储桶并仅更改值桶。这对于小地图非常有效,但是一旦你得到大约20个密钥,在Erlang 18中,他们将其表示改为基于Hash Array Mapped Tries,这也类似于Clojure。

注意元组不是持久的(它们代表内存中的连续空间)。一旦你更改了元组中的一个元素,就会创建一个全新的元组。这使得它们非常适合持有和访问少量元素以及模式匹配,但你绝对不想拥有许多元素。