Это интересная концепция. Одним из основных осложнений в «чисто функциональной» настройке было бы то, что идентичность объекта обычно не наблюдается в «чисто функциональном» смысле. I.Е., если я копирую объект или создаю новый идентичный, в Java ожидается, что клон не является оригиналом. Но в функциональной настройке ожидается, что новый будет семантически идентичным старому, хотя сборщик мусора будет рассматривать его по-разному.
Итак, если мы разрешаем идентификацию объекта быть частью семантики, это будет звук, иначе, вероятно, нет. В последнем случае, даже если взломать можно было бы найти (я подумал об одном, описанном ниже), у вас, вероятно, будет реализация языка, сражающаяся с вами повсюду, потому что она собирается делать всевозможные вещи, чтобы использовать этот факт что идентификация объекта не должна быть наблюдаемой.
Один из «взломов», который появился в моем сознании, заключался бы в использовании значений уникальной конструкции как ключей, так что в большинстве случаев значение равенства будет совпадать с эталонным равенством. Например, у меня есть библиотека, я использую лично в Haskell со следующим в интерфейсе:
data Uniq s
getUniq :: IO (Uniq RealWorld)
instance Eq (Uniq s)
instance Ord (Uniq s)
Хэш карту, как вы описали бы, вероятно, в основном, работа с ними, как ключ, но даже здесь я могу думать о это может сломаться: предположим, что пользователь хранит ключ в строгом поле некоторой структуры данных, при этом оптимизация оптимизатора «unbox-strict-fields» компилятора. Если «Uniq» - это просто оболочка newtype для целочисленного числа машин, больше не может быть объекта, к которому GC может указать и сказать «это ключ»; поэтому, когда пользователь идет и распаковывает свой ключ, чтобы использовать его, карта, возможно, уже забыла об этом.(Edit: этот конкретный пример, очевидно, можно обойти, сделать реализацию Uniq тем, что не может быть unboxed как это, дело в том, что это сложно, потому что компилятор пытается быть полезным во многих отношениях, мы могли бы не ожидайте)
TL; Я бы не сказал, что это невозможно сделать, но я подозреваю, что во многих случаях «оптимизация» либо сломается, либо будет нарушена слабой реализацией карты хэша, если не указывается идентификатор объекта первоклассный наблюдаемый статус.
Не совсем. Весь смысл слабой хэш-карты состоит в том, что GC автоматически выпускает недостижимые подграфы без необходимости периодически просить программиста. –
Я специально говорю, что это не может работать с постоянной структурой данных и предлагает способ примирить два поведения. Ваша проблема в том, что вы думаете, что я не могу ее достичь, но могу. У меня нет ссылки на объект (конечно), но у меня есть ключ. –
Ваша интерпретация поведения неверна. Привязка в слабой карте хэша удаляется, когда ключ * становится недоступным. Вы держались за ключ в своем примере счетчика, поэтому привязка к этому ключу не могла быть собрана, и такой проблемы нет. Достижимость 'o' не имеет значения. Я не вижу причин, почему это не может работать с постоянными структурами данных, потому что это влияет только на семантику недостижимых значений, которые по определению ненаблюдаемы. –