¿Qué es inmutable?
La comprobación para ver si el objeto solo contiene val
campos es una sobreproximación de inmutabilidad - el objeto puede muy bien contener var
s, pero nunca asignar valores diferentes en ellos. O los segmentos del programa que asignan valores a var
s pueden ser inalcanzables.
De acuerdo con la terminología Chris Okasaki, existen estructuras de datos inmutables y estructuras de datos funcionales.
Una estructura de datos inmutables (o una clase) es una estructura de datos que, una vez construida en memoria, nunca cambia sus componentes y valores - un ejemplo de esto es una tupla de Scala.
Sin embargo, si define la inmutabilidad de un objeto como la inmutabilidad de sí mismo y de todos los objetos accesibles a través de referencias del objeto, entonces una tupla puede no ser inmutable, depende de con qué lo instancia más adelante. A veces no hay suficiente información sobre el programa disponible en tiempo de compilación para decidir si una estructura de datos determinada es inmutable en el sentido de que contiene solo val
s. Y la información falta debido al polimorfismo, ya sea paramétrico, subtipificación o ad-hoc (clases de tipo).
Este es el primer problema para decidir la inmutabilidad: falta de información estática.
Una estructura de datos funcional es una estructura de datos en la que puede realizar operaciones cuyas salidas dependen únicamente de las entradas para un estado dado. Un ejemplo de dicha estructura de datos es un árbol de búsqueda que almacena en caché el último elemento buscado almacenando en un campo mutable. Aunque cada búsqueda escribirá el último elemento buscado en el campo mutable, de modo que si el elemento se busca nuevamente, la búsqueda no tiene que repetirse, los resultados de la operación de búsqueda para dicha estructura de datos permanecen siempre iguales dado que nadie inserta nuevos elementos en él. Otro ejemplo de una estructura de datos funcional es splay trees.
En un modelo de programación imperativa general, para comprobar si una operación es pura, es decir, ¿las salidas dependen únicamente de las entradas, es undecidable. Nuevamente, se podría usar una técnica como la interpretación abstracta para proporcionar una respuesta conservadora, pero esta no es una respuesta exacta a la cuestión de la pureza.
Este es el segundo problema para decidir si algo que tiene var
s es inmutable o funcional (observablemente inmutable): indecibilidad.
Gracias. Esa es una publicación perspicaz. – aioobe
Buena respuesta. El problema es realmente muy simple. La mutabilidad es una característica, que solo puede ocurrir en tiempo de ejecución. Lo que significa que ahora hay forma de decir en tiempo de compilación si su modelo estático es inmutable. Excepto por supuesto para cosas obvias que ni siquiera necesitarías verificar por inmutabilidad en primer lugar. – agilesteel