2011-04-02

juan_gandhi: (Default)
2011-04-02 11:03 am

reader monad в двух словах

Представьте, ваш код вдруг, оказывается, должен зависеть от конфигурации. Значит, он теперь является такой функцией:

Вход -> (Конфигурация -> Выход)

Или, переставляя параметры,

Конфигурация -> (Вход -> Выход)

Если уже есть функция F: Вход -> Выход, не зависящая от конфигурации, то из неё можно сделать Конфигурация -> (Вход -> Выход), просто это будет постоянная (по конфигурации) функция.

Что делать, если выход одной функции подаётся на вход другой?


F: Конфигурация -> (A -> B), G: Конфигурация -> (B -> C)


Как их скомпоновать в H: Конфигурация -> (A -> C)?

В принципе, у нас получается функция из декартова произведения конфигураций:

H': (Конфигурация × Конфигурация) -> (A -> C)


(Детали)
F: Конфигурация -> (A -> B), G: Конфигурация -> (B -> C)

даёт
F × G: (Конфигурация × Конфигурация) -> ((A -> B) × (B -> C)) -> (A -> C) -- последний шаг представляет собой композицию функций

(/Детали)


Ну, из этого легко сделать формат

H: Конфигурация -> (A -> C)


достаточно взять сначала диагональ,

Конфигурация -> (Конфигурация × Конфигурация)


А потом уже применить H'.

Шо за диагональ? Это которая x сопоставляет пару (x, x).

Вопросы?