Главная » Haskell » Модуль ST предназначенных для работы со строгими преобразователями монады State

0

 содержит описания программных сущностей,  предназначенных для работы со строгими преобразователями монады State.  Теоретическое обоснование этого процесса приведено в работе [13]. Использование модуля:

import  Control.Monad.ST

В данном модуле описано два алгебраических типа данных, которые необходимы для работы с преобразователями монады State. Оба этих алгебраических типа данных реализованы в виде примитивов, поэтому их определения недоступны в исходных кодах модулей.

Тип: ST

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

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

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

Этот алгебраический тип данных имеет экземпляры для следующих классов:

Typeable2, Functor,  Monad, MonadFix,  MArray (в различных вариантах) и Show.

Тип: RealWorld

Описание: служебный абстрактный и примитивный тип данных, используемый для внутренних целей системы типизации при работе с преобразователем монады State.  Нет никакой необходимости использовать этот тип в своих программах. Определение:

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

Тип RealWorld имеет экземпляр для класса Typeable.

Функция: runST

Описание: возвращает значение, вычисленное в рамках преобразователя монады State.  Директива forall в объявлении типа гарантирует, что внутреннее состояние недоступно вне преобразователя монады.

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

runST :: (forall s  . ST  s  a)  ->  a

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

Функция: fixST

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

первый аргумент этой функции является строгим, то результатом будет (?).

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

fixST :: (a  ->  ST  s  a)  ->  ST  s  a

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

Функция: stToIO

Описание: переводит значение из преобразователя монады State  в  монаду IO. Для этого использует служебный тип RealWorld.

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

stToIO  :: ST  RealWorld  a ->  IO a

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

Модуль  Lazy

Модуль Lazy содержит те же самые определения, что и модуль ST, за исключением того, что он поддерживает отложенные вычисления. Поскольку он является

«зависимым» модулем от ST, его импорт должен выглядеть следующим образом:

import  Control.Monad.ST.Lazy

Дополнительно к алгебраическим типам данных и функциям из  модуля ST рассматриваемый модуль содержит две функции для конвертации преобразователя монады State  из строгого в ленивый и обратно.

Функция: strictToLazyST

Описание: преобразует строгий преобразователь монады State в ленивый. Строгий преобразователь, переданный в эту функцию, не вычисляется, пока его значение не понадобится.

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

strictToLazyST :: ST  s  a ->  ST  s  a

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

Функция: lazyToStrictST

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

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

lazyToStrictST :: ST  s  a ->  ST  s  a

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

Модуль Strict

В целях единообразия (по отношению к модулю Lazy) в стандартной поставке библиотек языка Haskell имеется модуль Strict, который является «подчинённым» модулю ST. Этот модуль всего лишь реимпортирует сам модуль ST, не добавляя никаких новых определений.

7.5.   Модуль Parallel

Модуль Parallel является экспериментальным  и содержит  описание пары функций  для организации параллельных  вычислений. В  отличие от  модуля Concurrent  этот модуль может  использоваться на архитектурах, поддерживающих настоящее  распараллеливание вычислительных процессов. Подключение модуля производится следующим образом:

import  Control.Parallel

Функция: par

Описание: указывает, что было бы неплохо произвести процесс вычислений, заданный первым аргументом, параллельно с вычислением второго аргумента. Возвращает вычисленное значение второго аргумента.

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

par  :: a  ->  b ->  b

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

Семантически выражение a ‘par‘ b эквивалентно b.

Обычно функция par используется тогда, когда значение a необходимо получить позже. Также хорошей идеей является гарантирование того, что a является нетривиальным вычислением, чтобы затраты на организацию параллельного вычислительного процесса «окупились».

Необходимо отметить, что настоящий параллелизм поддерживается  только на некоторых архитектурах с определёнными трансляторами языка Haskell. Так, к примеру, компилятор GHC необходимо запускать с ключом -threaded. Функция: seq

Описание: возвращает значение (?), если первый аргумент равен (?).  В про-

тивном случае возвращает значение второго аргумента. Эта функция  обычно используется для оптимизации вычислений посредством  отказа от ненужной (в некотором конкретном случае) ленивости.

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

seq :: a  ->  b ->  b

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

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

По теме:

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