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