Что такое неизменяемое?
Проверка того, содержит ли объект только поля val
, представляет собой избыточное приближение неизменности - объект может очень хорошо содержать var
с, но никогда не назначать в них другие значения.Или сегменты программы, присваивающие значения var
s, могут быть недоступны.
Согласно терминологии Крис Окасаки , существуют неизменяемые структуры данных и функциональные структуры данных.
Неизменяемая структура данных (или класс) - это структура данных, которая, будучи построенной в памяти, никогда не изменяет свои компоненты и значения - примером этого является кортеж Scala.
Однако, если вы определяете неизменность объекта как неизменность самого себя и всех объектов, достижимых посредством ссылок из объекта, тогда кортеж может не быть неизменным - это зависит от того, с чем вы позднее создадите его экземпляр.Иногда недостаточно информации о программе, доступной во время компиляции, чтобы решить, является ли данная структура данных неизменной в том смысле, что она содержит только val
s.А информация отсутствует из-за полиморфизма, будь то параметрический, подтип или ad-hoc (классы типов).
Это первая проблема с решением неизменности - отсутствие статической информации.
Функциональная структура данных - это структура данных, в которой вы можете выполнять операции, выходные данные которых зависят исключительно от входных данных для данного состояния.Примером такой структуры данных является дерево поиска, которое кэширует последний найденный элемент, сохраняя его в изменяемом поле.Несмотря на то, что каждый поиск записывает последний искомый элемент в изменяемое поле, так что, если элемент снова ищется, поиск не должен повторяться, выходные данные операции поиска для такой структуры данных всегда остаются неизменными, есличто никто не вставляет новые предметы в него.Другим примером функциональной структуры данных являются деревья сплайнов .
В общей модели императивного программирования, чтобы проверить, является ли операция чистой, то есть - зависят ли выходные данные исключительно от входных данных, неразрешима .Опять же, можно использовать такой метод, как абстрактная интерпретация, чтобы дать консервативный ответ, но это не точный ответ на вопрос о чистоте.
Это вторая проблема с решением, если что-то имеет var
sнеизменный или функциональный (наблюдаемый неизменный) - неразрешимость.