Существует ли специальное небезопасное расширение GHC, чтобы спросить, указывают ли две ссылки Haskell на одно и то же местоположение?
Я знаю, что это может сломать ссылочную прозрачность, если она не используется должным образом. Но не должно быть никакого вреда (если я не пропущу что-то), если он используется очень осторожно, в качестве средства для оптимизации путем короткого рекурсивного (или дорогого) обхода данных, например. для реализации оптимизированного экземпляра Eq
, например:
instance Eq ComplexTree where
a == b = (a `unsafeSameRef` b) || (a `deepCompare` b)
обеспечение deepCompare
гарантируется как истина, если unsafeSameRef
принимает значение true (но не обязательно наоборот).
EDIT/PS: благодаря ответу, указывающему на System.Mem.StableName
, мне также удалось найти документ Растяжение хранилища менеджер: слабые указатели и стабильные имена в Haskell, которые, как оказалось, уже рассматривали эту проблему уже более 10 лет назад...