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), но отличаются следующим:
- Нет операции
freeStableName, в отличие от Foreign.StablePtr. Стабильные имена освобождаются системой выполнения, когда они больше не нужны. - Нет операции
deRefStableName. Вы не можете получить исходный объект Haskell из стабильного имени. Причина в том, что существование стабильного имени для объекта не гарантирует существование самого объекта; он всё ещё может быть удалён сборщиком мусора.
Конструкторы
| StableName (StableName# a) |
Типы
| Eq (StableName a) | С версии: base-2.1 |
Определено в GHC.StableName Методы(==) :: StableName a -> StableName a -> Bool Исходный код (/=) :: StableName a -> StableName a -> Bool Исходный код | |
makeStableName :: a -> IO (StableName a) Исходный код
Создаёт стабильное имя для произвольного объекта. Объект, переданный в качестве первого аргумента, не вычисляется makeStableName.
hashStableName :: StableName a -> Int Исходный код
Преобразует стабильное имя в целое число. Возвращаемое целое число не обязательно уникально; несколько стабильных имён могут соответствовать одному целому числу (на практике, однако, вероятность этого невелика, поэтому результат hashStableName является хорошим хеш-ключом).
eqStableName :: StableName a -> StableName b -> Bool Исходный код
Равенство стабильных имён, не требующее соответствия типов аргументов.
С версии: 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/8.10.2/docs/html/libraries/base-4.14.1.0/GHC-StableName.html