System.Mem.StableName
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | экспериментальная |
| Переносимость | непереносимая |
| Безопасный Haskell | Надёжный |
| Язык | Haskell2010 |
Содержание
Описание
Стабильные имена — это способ выполнения быстрого (O(1)), не совсем точного сравнения объектов.
Стабильные имена решают следующую проблему: предположим, вы хотите создать хеш-таблицу с объектами Haskell в качестве ключей, но хотите использовать равенство указателей для сравнения; возможно, потому что ключи большие, а хеширование медленное, или, может быть, потому что ключи бесконечны по размеру. Мы не можем создать хеш-таблицу, используя адрес объекта в качестве ключа, потому что объекты перемещаются сборщиком мусора, что означает необходимость перехеширования после каждого сбора мусора.
Стабильные имена
data StableName a Источник
Абстрактное имя объекта, поддерживающее равенство и хеширование.
Стабильные имена обладают следующим свойством:
- Если
sn1 :: StableNameиsn2 :: StableNameиsn1 == sn2, тоsn1иsn2были созданы вызовамиmakeStableNameнад одним и тем же объектом.
Обратное не обязательно верно: если два стабильных имени не равны, то объекты, которые они обозначают, все равно могут быть равны. Обратите особое внимание на то, что mkStableName может вернуть другое StableName после оценки объекта.
Стабильные имена похожи на стабильные указатели (Foreign.StablePtr), но отличаются следующим образом:
- Нет операции
freeStableName, в отличие от Foreign.StablePtr. Стабильные имена освобождаются системой выполнения, когда они больше не нужны. - Нет операции
deRefStableName. Вы не можете получить обратно исходный объект Haskell из стабильного имени. Причина в том, что существование стабильного имени для объекта не гарантирует существование самого объекта; он все еще может быть удален сборщиком мусора.
Примеры
| Eq (StableName a) |
makeStableName :: a -> IO (StableName a) Источник
Создаёт стабильное имя для произвольного объекта. Объект, переданный в качестве первого аргумента, не оценивается при создании стабильного имени.
hashStableName :: StableName a -> Int Источник
Преобразует стабильное имя в целое число. Возвращаемое целое число не обязательно уникально; несколько стабильных имён могут соответствовать одному целому числу (на практике, однако, вероятность этого невелика, поэтому результат преобразования в целое число хорошо подходит в качестве хеш-ключа).
eqStableName :: StableName a -> StableName b -> Bool Источник
Операция равенства для стабильных имён, которая не требует, чтобы типы аргументов совпадали.
С версии: 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/7.10.3/docs/html/libraries/base-4.8.2.0/System-Mem-StableName.html