В функциональное программирование, а монада трансформатор конструктор типа, который принимает монада в качестве аргумента и в результате возвращает монаду.
Преобразователи монад могут использоваться для компоновки функций, инкапсулированных монадами, таких как состояние, Обработка исключений, а ввод / вывод - по модульному принципу. Обычно преобразователь монад создается путем обобщения существующей монады; применение результирующего преобразователя монады к монаде идентичности дает монаду, эквивалентную исходной монаде (игнорируя все необходимые упаковки и распаковки).
Определение
Преобразователь монад состоит из:
- Конструктор типа
т
из своего рода (* -> *) -> * -> *
- Монадные операции
возвращаться
и связывать
(или эквивалентную формулировку) для всех т м
куда м
монада, удовлетворяющая законы монад - Дополнительная операция,
лифт :: м а -> т м а
, удовлетворяющие следующим законам:[1] (обозначение `привязать`
ниже указано инфиксное приложение):поднимать . return = возврат
lift (m `bind` k) = (lift m)` bind` (lift. k)
Примеры
Вариант монадного трансформатора
Учитывая любую монаду
, вариант монадного преобразователя
(куда
обозначает тип опциона ) определяется:
![начать {массив} {ll}
mathrm {return}: & A arr mathrm {M} left (A ^ {?} ight) = a mapsto mathrm {return} (mathrm {Just}, a)
mathrm {bind}: & mathrm {M} left (A ^ {?} ight) arr left (A arr mathrm {M} left (B ^ {?} ight) ight) arr mathrm {M} left (B ^ {? } ight) = m mapsto f mapsto mathrm {bind}, m, left (a mapsto egin {case} mbox {return Nothing} & mbox {if} a = mathrm {Nothing} f, a '& mbox {if} a = mathrm {Just}, а 'конец {случаи} ight)
mathrm {lift}: & mathrm {M} (A) arr mathrm {M} left (A ^ {?} ight) = m mapsto mathrm {bind}, m, (a mapsto mathrm {return} (mathrm {Just}, а)) конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/17e9fc106ff6d8ec47b398571e24bc5db169e9be)
Преобразователь монад исключения
Учитывая любую монаду
, преобразователь монад исключения
(куда E является типом исключений) определяется:
![начать {массив} {ll}
mathrm {return}: & A arr mathrm {M} (A + E) = a mapsto mathrm {return} (mathrm {значение}, a)
mathrm {bind}: & mathrm {M} (A + E) arr (A arr mathrm {M} (B + E)) arr mathrm {M} (B + E) = m mapsto f mapsto mathrm {bind}, m , слева (карта для начала {случаев} mbox {return err} e & mbox {if} a = mathrm {err}, e f, a '& mbox {if} a = mathrm {value}, a' end {cases } ight)
mathrm {lift}: & mathrm {M}, A arr mathrm {M} (A + E) = m mapsto mathrm {bind}, m, (a mapsto mathrm {return} (mathrm {value}, a))
конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5fc848fdaac8ba08f8aba61f15a802a605003d45)
Читатель монада преобразователь
Учитывая любую монаду
, преобразователь монад читателя
(куда E является типом среды) определяется:
![начать {массив} {ll}
mathrm {return}: & A arr E arr mathrm {M}, A = a mapsto e mapsto mathrm {return}, a
mathrm {bind}: & (E arr mathrm {M}, A) arr (A arr E arr mathrm {M}, B) arr E arr mathrm {M}, B = m mapsto k mapsto e mapsto mathrm {bind}, (m, e), (отображение на k, a, e)
mathrm {lift}: & mathrm {M}, A arr E arr mathrm {M}, A = mapsto e mapsto
конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0823ba9c60affee57ae8f55bd07cfbf6d22efe67)
Преобразователь государственной монады
Учитывая любую монаду
, преобразователь монад состояний
(куда S является типом состояния) определяется:
![начать {массив} {ll}
mathrm {return}: & A arr S arr mathrm {M} (A imes S) = mapsto s mapsto mathrm {return}, (a, s)
mathrm {bind}: & (S arr mathrm {M} (A imes S)) arr (A arr S arr mathrm {M} (B imes S)) arr S arr mathrm {M} (B imes S) = m mapsto k mapsto s mapsto mathrm {bind}, (m, s), ((a, s ') mapsto k, a, s')
mathrm {lift}: & mathrm {M}, A arr S arr mathrm {M} (A imes S) = m mapsto s mapsto mathrm {bind}, m, (a mapsto mathrm {return}, (a, s)) конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3b4fc42e58e7a9e2cbe265ec1d29db054672fa9)
Преобразователь монады писателя
Учитывая любую монаду
, писатель монад трансформер
(куда W наделен моноид операция ∗ с элементом идентичности
) определяется:
![начать {массив} {ll}
mathrm {return}: & A arr mathrm {M} (W imes A) = a mapsto mathrm {return}, (varepsilon, a)
mathrm {bind}: & mathrm {M} (W imes A) arr (A arr mathrm {M} (W imes B)) arr mathrm {M} (W imes B) = m mapsto f mapsto mathrm {bind}, m , ((w, a) mapsto mathrm {bind}, (f, a), ((w ', b) mapsto mathrm {return}, (w * w', b)))
mathrm {lift}: & mathrm {M}, A arr mathrm {M} (W imes A) = m mapsto mathrm {bind}, m, (a mapsto mathrm {return}, (varepsilon, a))
конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c07fa244f2d59a76b75fc12338c5a7c398a18e00)
Преобразователь монад продолжения
Учитывая любую монаду
, преобразователь монады продолжения отображает произвольный тип р на функции типа
, куда р - тип результата продолжения. Это определяется:
![начать {массив} {ll}
mathrm {return} двоеточие & A arr left (A arr mathrm {M}, R ight) arr mathrm {M}, R = a mapsto k mapsto k, a
mathrm {bind} двоеточие и left (left (A arr mathrm {M}, R ight) arr mathrm {M}, R ight) arr left (A arr left (B arr mathrm {M}, R ight) arr mathrm {M }, Справа) arr left (B arr mathrm {M}, Right) arr mathrm {M}, R = c mapsto f mapsto k mapsto c, left (a mapsto f, a, k ight)
mathrm {lift} двоеточие и mathrm {M}, A arr (A arr mathrm {M}, R) arr mathrm {M}, R = mathrm {bind}
конец {массив}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5a5780a02abc51d650d22ec031a28c191d8eb2e4)
Обратите внимание, что преобразования монад обычно не коммутативный: например, применение преобразователя состояния к монаде опций дает тип
(вычисление, которое может потерпеть неудачу и не дать конечного состояния), тогда как обратное преобразование имеет тип
(вычисление, которое дает конечное состояние и необязательное возвращаемое значение).
Смотрите также
Рекомендации
внешняя ссылка
![[значок]](//upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/20px-Wiki_letter_w_cropped.svg.png) | Эта секция нуждается в расширении. Вы можете помочь добавляя к этому. (Май 2008 г.) |