Главная » Haskell » Модуль Mem

0

В  модуле Mem  определяется  единственная функция,  которая  используется для воздействия на систему управления памяти в языке Haskell. Использование модуля:

import System.Mem

Функция: performGC

Описание: немедленно при вызове запускает процесс сборки мусора.

Определение:

performGC :: IO ()

Функция определена в виде примитива.

11.9.1.    Модуль StableName

Модуль StableName предлагает к использованию так называемые стабильные имена, то есть идентификаторы  объектов в памяти, которые не меняются при изменении местоположения объекта. Такие стабильные имена помогают производить не совсем точное сравнение объектов (достаточно быстрое, сложности O(1)), равно как и позволяют осуществлять их хеширование. Использование модуля:

import System.Mem.StableName

Стабильные имена решают следующую задачу. Если имеется необходимость построить хеш-таблицу, ключами  в  которой  выступают  некоторые значения из языка Haskell, то сравнение  ключей должно производиться на основе некоторых указателей,  поскольку  сами ключи,  возможно, являются громоздкими и неудобными для сравнения (например, они бесконечны). Невозможно построить хеш-таблицу на основе указателей на адреса памяти, по которым расположены ключи, поскольку объекты могут перемещаться в памяти в процессе сборки мусора, что предполагает тот факт, что при каждом запуске сборщика мусора необходимо производить  перерасчёт всей хеш-таблицы.

Решить эту проблему позволяет тип StableName.

Тип: StableName

Описание: абстрактный идентификатор объекта заданного типа a, который поддерживает сравнение и хеширование.

Определение:

data  StableName  a = …

Тип определён в виде примитива.

Стабильные имена имеют важное свойство. Если два стабильных имени sn1 и sn2 равны (предикат (==) возвращает значение True для них), то верно то, что эти два имени созданы при помощи функции makeStableName на одном и том же объекте. Обратное, тем не менее, неверно. Если два стабильных имени не равны, то это не значит, что  они  созданы на разных объектах. Родительский объект может быть одним и тем же.

Стабильные имена похожи  на стабильные указатели StablePtr  (см. раздел 10.5.), однако имеются важные отличия. Для стабильных имён нет возможности освободить от них память, поскольку они выделяются и высвобождаются обычной системой управления памятью языка Haskell. Кроме того, нет возможности осуществить обратное  преобразование от стабильного имени к объекту, который  его породил.  Причина этого заключается в том, что нет никакой гарантии в том,  что при существовании стабильного имени всё ещё существует соответствующий объект.

Для типа StableName определены экземпляры классов Typeable1 и Eq.

Функция: makeStableName

Описание: создаёт стабильное имя для произвольного объекта. Сам объект, передаваемый в качестве аргумента, не используется в вычислениях.

Определение:

makeStableName  :: a ->  IO  (StableName a)

Функция определена в виде примитива.

Функция: hashStableName

Описание: преобразует стабильное имя в целочисленное значение. Возвращаемое значение не является уникальным, некоторые различные стабильные имена могут быть преобразованы в одно и то же целочисленное значение (на практике, однако, шансы этого малы, поэтому эта функция может использоваться для генерации ключей в хеш-таблицах).

Определение:

hashStableName :: StableName a ->  Int

Функция определена в виде примитива.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии