Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir是否具有类似于Clojure的持久数据结构?_Clojure_Elixir - Fatal编程技术网

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

Elixir是否具有类似于Clojure的持久数据结构?,clojure,elixir,Clojure,Elixir,Elixir中所有不变的数据结构都是持久的吗?如果没有,哪些是,哪些不是?另外,它们与Clojure中的持久数据结构相比如何?是的,它们大多数都是持久数据结构 例如,长生不老药列表是链接列表,而链接列表是退化树(它只有一个分支): 每次在列表前添加元素时,它都将共享其尾部: Elixir: [0|list] Tree: 0 -> (1 -> 2 -> 3 -> 4) Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,实际上是树 映射

Elixir中所有不变的数据结构都是持久的吗?如果没有,哪些是,哪些不是?另外,它们与Clojure中的持久数据结构相比如何?

是的,它们大多数都是持久数据结构

例如,长生不老药列表是链接列表,而链接列表是退化树(它只有一个分支):

每次在列表前添加元素时,它都将共享其尾部:

Elixir: [0|list]
Tree:   0 -> (1 -> 2 -> 3 -> 4)
Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,实际上是树

映射也是持久的数据结构,它们非常有趣,因为它们的表示形式会根据键的数量而改变。当您有小地图时,让我们说:

%{:foo => 1, :bar => 2, :baz => 3}
其代表如下:

        -------------(:foo, :bar, :baz)
        |
(map, keys, values)
               |
               ------(1, 2, 3)
因此,每次更新一个密钥时,我们共享“密钥”存储桶,只更改存储桶中的值。这对于小地图非常有效,但是一旦你得到大约20个键,在Erlang 18中,它们会改变它们的表示方式,以类似于Clojure的表示方式为基础


注意元组不是持久的(它们表示内存中的连续空间)。一旦更改元组中的一个元素,就会创建一个全新的元组。这使得它们非常适合保存和访问少数元素以及模式匹配,但您肯定不想保存很多元素。

您的意思是这样的,对吗?谢谢所以主要的区别是没有持久的向量/元组。是否有关于长生不老药列表属性的书面记录?是O(1)伯爵吗?追加到结尾?在这里找到答案,长度是O(n),追加到结尾也是O(n)。有没有实现持久向量的计划?目前有两种选择:使用Erlang的“数组”模块或使用映射作为向量(键是数字)。但是,如果您想执行非常特定的向量操作,第二个选项就不够了。我们已经讨论过添加向量,但它目前不在路线图中。该库(完全公开:我是作者)实现了基于Clojure设计的持久化向量。这仍然是一个有点早的阶段,但旨在提供一个有吸引力的第三选择。
        -------------(:foo, :bar, :baz)
        |
(map, keys, values)
               |
               ------(1, 2, 3)