В функциональном программировании преобразователь монад — это конструктор типов, который принимает монаду в качестве аргумента и возвращает монаду в качестве результата.
Трансформаторы монад могут использоваться для составления функций, инкапсулированных монадами, такими как состояние, обработка исключений и ввод-вывод, модульным способом. Обычно трансформер монад создается путем обобщения существующей монады; применение полученного трансформера монады к монаде идентичности дает монаду, которая эквивалентна исходной монаде (игнорируя любую необходимую упаковку и распаковку).
Определение
Монадный трансформатор состоит из:
- Конструктор
t
типа (* -> *) -> * -> *
- Операции монад
return
и bind
(или эквивалентная формулировка) для всех t m
, где m
есть монада, удовлетворяющая законам монады - Дополнительная операция,
lift :: m a -> t m a
, удовлетворяющая следующим законам: [1] (обозначение `bind`
ниже указывает на инфиксное применение):lift . return = return
lift (m `bind` k) = (lift m) `bind` (lift . k)
Примеры
Опциональный монада-трансформер
Для любой монады трансформатор монады опций (где обозначает тип опции ) определяется следующим образом:
Исключение монадного трансформатора
Для любой монады преобразователь монад исключений (где E — тип исключений) определяется следующим образом:
Читатель-трансформатор монады
Для любой монады преобразователь монады читателя (где E — тип среды) определяется следующим образом:
Трансформатор монады состояния
Для любой монады трансформатор монады состояния (где S — тип состояния) определяется следующим образом:
Писатель монада трансформатор
Для любой монады преобразователь монады писателя (где W наделен моноидной операцией ∗ с элементом идентичности ) определяется следующим образом:
Продолжение монадного трансформатора
При наличии любой монады трансформатор монады продолжения отображает произвольный тип R в функции типа , где R — тип результата продолжения. Он определяется следующим образом:
Обратите внимание, что преобразования монад обычно не являются коммутативными : например, применение преобразователя состояний к монаде опций дает тип (вычисление, которое может завершиться неудачей и не дать конечного состояния), тогда как обратное преобразование имеет тип (вычисление, которое дает конечное состояние и необязательное возвращаемое значение).
Смотрите также
Ссылки
- ^ Лян, Шэн; Худак, Пол; Джонс, Марк (1995). «Трансформаторы монад и модульные интерпретаторы» (PDF) . Труды 22-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . Нью-Йорк, Нью-Йорк: ACM. стр. 333–343. doi : 10.1145/199448.199528 .
Внешние ссылки
В Wikibook Haskell есть страница на тему: Трансформеры монад
- Высокотехническая запись в блоге, в которой кратко рассматривается часть литературы по монадным трансформаторам и связанным с ними концепциям, с акцентом на категориально-теоретическое рассмотрение.