ejemplos - ¿Elixir tiene estructuras de datos persistentes similares a Clojure?
clojure ejemplos (1)
¿Son persistentes todas las estructuras de datos inmutables en Elixir? Si no, ¿cuáles son y cuáles no? Además, ¿cómo se comparan con las estructuras de datos persistentes en Clojure?
Sí, la mayoría de ellos son estructuras de datos persistentes.
Por ejemplo, las listas de Elixir son listas vinculadas, y una lista vinculada es un árbol degenerado (solo tiene una rama):
Elixir: list = [1, 2, 3, 4]
Tree: 1 -> 2 -> 3 -> 4
Cada vez que anteponga un elemento a una lista, compartirá su cola:
Elixir: [0|list]
Tree: 0 -> (1 -> 2 -> 3 -> 4)
Las implementaciones de HashSet y HashDict de Elixir se basan en las estructuras de datos persistentes de Clojure y son efectivamente árboles. Hay algunos escritos en el blog de Joseph .
Los mapas también son estructuras de datos persistentes y son muy interesantes porque su representación cambia según la cantidad de claves. Cuando tengas pequeños mapas, digamos:
%{:foo => 1, :bar => 2, :baz => 3}
Se representa como:
-------------(:foo, :bar, :baz)
|
(map, keys, values)
|
------(1, 2, 3)
Por lo tanto, cada vez que actualice una clave, compartimos el grupo de "claves" y cambiamos solo el grupo de valores. Esto es muy eficiente para mapas pequeños, pero una vez que se llega a aproximadamente 20 teclas, en Erlang 18, cambian su representación para basarse en Hash Array Mapped Tries, que también es similar a Clojure.
Sin embargo, las tuplas de notas no son persistentes (representan un espacio contiguo en la memoria). Una vez que cambia un elemento en la tupla, se crea una tupla completamente nueva. Esto los hace excelentes para mantener y acceder a pocos elementos, así como para la coincidencia de patrones en ellos, pero definitivamente no desea mantener muchos elementos.