GHC.StableName
| Авторские права | (c) Университет Глазго, 2001 |
|---|---|
| Лицензия | В стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильная |
| Переносимость | непереносимый |
| Безопасный Haskell | Безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Стабильные имена позволяют выполнять быстрое ( \(\mathcal{O}(1)\) ), но не вполне точное сравнение объектов.
Стабильные имена решают следующую задачу: предположим, что вы хотите создать хеш-таблицу, в которой ключами будут объекты Haskell, но для сравнения хотите использовать равенство указателей; возможно, потому что ключи велики и вычисление хеша было бы медленным, или потому что ключи имеют бесконечный размер. Нельзя создать хеш-таблицу, используя адрес объекта в качестве ключа, поскольку сборщик мусора перемещает объекты, а значит, после каждой сборки мусора потребуется повторное хеширование.
Стабильные имена
data StableName a Источник
Абстрактное имя объекта, поддерживающее равенство и хеширование.
Стабильные имена обладают следующим свойством:
- Если
sn1 :: StableNameиsn2 :: StableNameиsn1 == sn2, тоsn1иsn2были созданы вызовамиmakeStableNameдля одного и того же объекта.
Обратное утверждение не обязательно верно: если два стабильных имени не равны, объекты, которые они обозначают, всё ещё могут быть равны. Обратите особое внимание: makeStableName может возвращать другое StableName после вычисления объекта.
Стабильные имена похожи на стабильные указатели (Foreign.StablePtr), но отличаются следующим:
- В отличие от Foreign.StablePtr, операция
freeStableNameотсутствует. Среда выполнения освобождает стабильные имена, когда они больше не нужны. - Операция
deRefStableNameотсутствует. По стабильному имени нельзя получить исходный объект Haskell. Причина в том, что наличие стабильного имени объекта не гарантирует существования самого объекта: он всё ещё может быть удалён сборщиком мусора.
Конструкторы
| StableName (StableName# a) |
Экземпляры
| Eq (StableName a) Источник | Начиная с: base-2.1 |
Определён в GHC.Internal.StableName Методы(==) :: StableName a -> StableName a -> Bool Источник (/=) :: StableName a -> StableName a -> Bool Источник | |
makeStableName :: a -> IO (StableName a) Источник
Создаёт StableName для произвольного объекта. Объект, переданный в качестве первого аргумента, не вычисляется функцией makeStableName.
hashStableName :: StableName a -> Int Источник
Преобразует StableName в Int. Возвращаемое Int не обязательно уникально: несколько StableName могут отображаться в одно и то же Int (однако на практике вероятность этого мала, поэтому результат hashStableName хорошо подходит в качестве ключа хеширования).
eqStableName :: StableName a -> StableName b -> Bool Источник
Проверяет равенство StableName без требования совпадения типов аргументов.
Начиная с: base-4.7.0.0
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/GHC-StableName.html