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