Elixir是否具有类似于Clojure的持久数据结构?

Aar*_*sen 18 clojure elixir

Elixir中的所有不可变数据结构都是持久的吗?如果不是,哪一个是哪个,哪个不是?另外,它们如何与Clojure中的持久数据结构进行比较?

Jos*_*lim 24

是的,其中大多数是持久性数据结构.

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

Elixir: list = [1, 2, 3, 4]
Tree:   1 -> 2 -> 3 -> 4
Run Code Online (Sandbox Code Playgroud)

每次将一个元素添加到列表中时,它将共享其尾部:

Elixir: [0|list]
Tree:   0 -> (1 -> 2 -> 3 -> 4)
Run Code Online (Sandbox Code Playgroud)

Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,并且实际上是树.约瑟夫的博客上写了一些内容.

地图也是持久性数据结构,它们非常有趣,因为它们的表示基于键的数量而变化.当你有小地图时,让我们说:

%{:foo => 1, :bar => 2, :baz => 3}
Run Code Online (Sandbox Code Playgroud)

它表示为:

        -------------(:foo, :bar, :baz)
        |
(map, keys, values)
               |
               ------(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 目前您有两种选择:使用Erlang的"数组"模块或使用地图作为向量(键是数字).如果你想做非常特殊的向量操作,第二个选项是不够的.我们已经讨论过添加向量,但目前还不在路线图中. (2认同)