52700.fb2
результирующие значения таких функций будут списками.
При этом для каждого такого m мы попытаемся построить свой замкнутый мир специальных функций a
-> m b. Он будет жить внутри вселенной всех произвольных функций типа a -> b. В этом нам поможет
специальный класс типов, который называется категорией Клейсли (эта конструкция носит имя математика
Хенрика Клейсли).
class Kleisli m where
idK
:: a -> m a
(*> ) :: (a -> m b) -> (b -> m c) -> (a -> m c)
Этот класс является классом Category в мире наших специальных функций. Если мы сотрём все буквы m,
то мы получим обычные типы для тождества и композиции. В этом мире должны выполняться те же правила:
f
*> idK
== f
idK *> f
== f
f *> (g *> h) == (f *> g) *> h
Взаимодействие с внешним миром
С помощью класса Kleisli мы можем составлять из одних специальных функций другие. Но как мы
сможем комбинировать специальные функции с обычными?
Поскольку слева у нашей специальной функции обычный общий тип, то с этой стороны мы можем вос-
пользоваться обычной функцией композиции >> . Но как быть при композиции справа? Нам нужна функция
типа:
(a -> m b) -> (b -> c) -> (a -> m c)
Оказывается мы можем составить её из методов класса Kleisli. Мы назовём эту функцию композиции
(+> ).
(+> ) :: Kleisli m => (a -> m b) -> (b -> c) -> (a -> m c)
f +> g = f *> (g >> idK)
С помощью метода idK мы можем погрузить в мир специальных функций любую обычную функцию.
Композиция функций | 87
Три композиции
У нас появилось много композиций целых три:
аргументы
|
результат
обычная
>>
обычная
==
обычная
специальная
+>
обычная
==
специальная
специальная
*>
специальная
==