Совместное использование — это своего рода равенство: равенство указателей. В области ценностей Haskell (семантическая интерпретация) нет такой вещи, как совместное использование. Значения могут быть равны, только если они имеют экземпляры Eq
, и тогда "равенство" определяется как бинарное отношение (==)
.
Таким образом, совместное использование избегает семантической интерпретации, ссылаясь на это лежащее в основе равенство указателей, которое существует благодаря реализации, а не семантике. Хотя иногда это полезный побочный эффект. К сожалению, поскольку язык Haskell определяется его семантической интерпретацией, использование совместного использования является неопределенным поведением. Он привязан к конкретной реализации. Несколько библиотек используют совместное использование и, таким образом, их поведение связано с GHC.
Однако есть один встроенный механизм обмена. Об этом свидетельствует StableName
интерфейс. Мы генерируем объекты StableName a
, используя makeStableName :: a -> IO (StableName a)
, и имеем instance Eq (StableName a)
— таким образом, StableName
вводит своего рода равенство для любого типа.
StableName
равенство — это почти равенство указателей. Чтобы процитировать документацию Хэддока
Если sn1 :: StableName
и sn2 :: StableName
и sn1 == sn2
, то sn1
и sn2
были созданы вызовами makeStableName
для одного и того же объекта.
Обратите внимание, что это всего лишь оператор if, а не если и только если. Тот факт, что две вещи могут быть «эквивалентны указателям», но все же иногда иметь разные стабильные имена, является (а) вынужденным из-за гибкости, которую Haskell оставляет сборщику мусора, и (б) лазейкой, которая позволяет StableName
s существовать в любой реализации Haskell, даже если нет такая вещь, как «равенство указателя» в реализации вообще.
Эти StableName
по-прежнему не имеют семантического значения, но, поскольку они представлены в монаде IO
, все в порядке. Вместо этого можно сказать, что они реализуют (по иронии судьбы) нестабильное подмножество наименьшего (наиболее конкретного) отношения равенства, возможного для любого типа.
person
J. Abrahamson
schedule
08.05.2013