La inmutabilidad es primordial en la mayoría de los dominios de FP, pero ¿hacen copias superficiales o profundas?
Parece que clonar todos los elementos de una matriz podría ser prohibitivamente costoso, por ejemplo, para la mayoría de las aplicaciones.
En primer lugar, cada idioma puede manejar las cosas de manera diferente. Por lo tanto, me centraré en dos idiomas con los que estoy muy familiarizado: Erlang y Elixir
- Si una cadena de números contiene todas las demás cadenas de números, ¿eso significa que la cadena también se contiene estrictamente a sí misma?
- Quiero usar una cola prioritaria en un problema. Creo que implementar una cola prioritaria usando una matriz es más fácil que usar un montón. ¿Qué piensas y por qué?
- ¿Para qué sirve un tamaño de obtención de matriz?
- Cómo implementar la codificación y decodificación de Huffman usando una matriz y no un árbol
- ¿Cuál es el mejor método de clasificación para usar si solo un elemento está fuera de servicio?
Estos idiomas actúan de manera diferente según lo que hagas. Hay dos casos: hacemos llamadas con el mismo actor y manejamos datos en diferentes actores.
Primero necesita saber que los actores son procesos aislados. Son completamente independientes. Esto incluye la pila de memoria. Cada actor tiene su propio stack. Entonces, cuando los datos se manejan dentro de un actor separado, estos datos se envían como un mensaje y se asignan nuevos en la pila de otros actores. Esto tiene sentido ya que ambos idiomas están diseñados para ejecutarse en clústeres que conectan varias máquinas físicas.
Cuando se manejan datos dentro del mismo actor, no tiene sentido copiar datos en profundidad. Por lo general, usted entrega una referencia a ese conjunto de datos (ya que no puede mutarlo, no es un problema tener varias funciones trabajando en el mismo conjunto de datos). También cuando, por ejemplo, extiende una lista, no copia ninguna referencia. Supongamos que tiene una lista como [2, 3, 4] y desea agregar 1 como el nuevo encabezado.
(en codigo:
x = [1, 2, 3]
y = [1 | x]
)
Aquí no se cambia en absoluto la referencia de x. Una lista es la estructura de datos principal de la mayoría de los lenguajes funcionales. Todo lo que hace es agregar un nuevo elemento de lista 1 que contiene los datos y la referencia al siguiente elemento. El siguiente elemento es el elemento principal de x. Eso es. Entonces no tocas x. Todo lo que haces es lo que haces de todos modos dentro de una lista. Conecta la nueva cabeza al resto.
Supongo que esto es más o menos lo mismo en muchos lenguajes funcionales. Por lo que sé, Clojure funciona de la misma manera. Se entregan referencias que son comparativamente baratas.