Стрелка Клейсли — это функция, чей результат завёрнут в монаду:
a -> m bМонадический код — это цепочки функций вида : каждая что-то считает и попутно порождает контекст. Хочется складывать их так же легко, как чистые функции точкой . Стрелки Клейсли и их композиция дают ровно это. Обычная функция — её частный случай (контекст тривиален).
Две стрелки Клейсли склеиваются в одну — это композиция Клейсли (её оператор зовут «рыбкой»):
(>=>) :: (a -> m b) -> (b -> m c) -> (a -> m c)
(<=<) :: (b -> m c) -> (a -> m b) -> (a -> m c) -- обратная «рыбка»
-- композиция Клейсли выражается через bind монады:
(f >=> g) x = f x >>= gОбратный порядок пишут — он читается как обычная композиция . Тождественная стрелка — (она же ):
pure :: a -> m aВозьмём пример из предыдущего раздела и перепишем его на стрелках:
-- в разделе про монады было:
processNumber x = pure x >>= halveEven >>= halveAndScale
-- на стрелках Клейсли — без аргумента и без pure:
processNumber = halveEven >=> halveAndScaleСкоро мы поговорим детальнее про категории, а тут пока скажем пару слов, а именно, возьмём типы за объекты, стрелки Клейсли за морфизмы, за композицию, а за тождество — получится категория Клейсли. Её аксиомы — это в точности законы монады:
pure >=> f == f -- единица
f >=> pure == f
(f >=> g) >=> h == f >=> (g >=> h) -- ассоциативностьТо есть «монада» и «категория Клейсли» — два названия одного и того же. Законы, которые через выглядят громоздко, здесь становятся привычными.