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

0

 представляет  описание программных сущностей,  которые  описывают монадические неподвижные точки.  Детальное  описание этого понятия доступно в работе [5]. Данный модуль является «подчинённым»  по отношению к модулю Monad, поэтому его импорт выглядит следующим образом:

import  Control.Monad.Fix

Кроме того, если модуль Monad уже подключён, импортировать  модуль Fix

нет необходимости.

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

class Monad  m   => MonadFix  m   where mfix  :: (a  ->  m  a)  ->  m   a

Любой экземпляр этого класса должен удовлетворять следующим законам:

1)                        Чистота:

mfix  (return . h)  = return (fix  h)

2)                        Сокращение влево:

mfix  (\x ->  a >>= \y ->  f x  y) = a >>= \y ->  mfix  (\x ->  f x  y)

3)                        Скольжение (для строгих функций h):

mfix  (\x ->  mfix  (\y ->  f x  y)) = mfix  (\x ->  f x  x)

4)                        Вложенность:

u <*> pure  y  = pure  ($  y) <*> u

Единственный метод класса mfix  возвращает неподвижную точку заданной функции f.  Метод выполняет функцию f только один раз с  подачей на вход функции её результата,  полученного на предыдущем шаге. Следовательно, если функция f не является строгой, метод mfix будет расходиться.

Экземплярами этого класса являются типы: IO, Maybe, [], ST  s, (->)  r.

В рассматриваемом модуле описана также одна утилитарная функция:

Функция: fix

Описание: возвращает наименьшую неподвижную точку  заданной  функции f, то есть такое наименьшее значение x, что f x = x.

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

fix :: (a  ->  a)  ->  a

fix f = let x  = f x  in x

7.5.2.       Модуль Instances

В модуле Instances определены экземпляры классов Functor (см. стр. 211) и Monad  (см. стр. 211) для некоторых  дополнительных типов данных. Также в этом классе заново определены сами классы для исключения импорта модулей, содержащих первоначальные определения. Само собой разумеется, что определения классов тождественны  тем, что даны в модуле Monad.

Данный модуль является «подчинённым» модулю Monad, поэтому его импорт выглядит следующим образом:

import  Control.Monad.Instances

Наконец, в этом модуле определены экземпляры следующих типов. Для класса Functor  определены экземпляры для типов (->),  (,) и Either a. Для класса Monad определён экземпляр для типа типов (->).

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

По теме:

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