Эффекты:

Преобразования, композиции, трансформеры

(и немного моего исследования)




Мурат Касимов, Select *

Математические функции


x ↦ f (x)


totalité ∘ déterminisme ∘ pas d'effets secondaires


Примеры эффектов:


Опциональность:
Maybe
Множественность:
List
Мутабельность:
State
Ввод/вывод:
IO

И что с ними делать?


Обозначение Пример
Наложение:
t := a
Maybe := Dog
Преобразование:
t ~> u
List ~> Maybe
Композиция:
u :. t := a
List :. Maybe := Dog
Трансформер:
u :> t := a
List :> Maybe := Dog

Как наложить эффект?


Естественное преобразование


Композиция функторов


Монадные трансформеры


Dog {...}

Dog

Just Dog | Nothing

Maybe := Dog

[Dog {...}, ..]

List := Dog

find, head, last, ...

List ~> Maybe

КомпозицииТрансформеры
Обозначение:
u :. t := a
u :> t := a
Влияние:

Никак

Все эффекты как один

Построение:

Наложением

Нужен специальный тип

Монады:

Программа, рассчитывающая корректность расстановленных скобок разных стилей:

() => { return { names : [] } }
  • Надо хранить список всех незакрытых скобок
  • Надо выкидывать ошибку о неправильном расположении скобки
State (List := Style) :> Error Stumble := Int

Программа, скачивающая альбомы с Bandcamp:

Configured Filepath :> Concurrently := ()
cover, track = Concurrently (load >>= save)
cover *> track 1 *> track n *> ...

Поднимаем все!

f = lift print :: Liftable IO t => t ()
g = lift Nothing :: Liftable Maybe t => t ()
f *> g :: Maybe :> IO := ()

Спасибо!