Это первая из серии статей, посвященных изучению типа данных с самым странным названием во всех языках программирования, за исключением, возможно, Yoneda. Недавно я обнаружил, что на самом деле это простой для понимания и довольно полезный инструмент, поэтому в этом посте я расскажу об основах, а в следующих покажу несколько примеров из реальной жизни.

Прежде всего: мое объяснение может быть не очень хорошим и, вероятно, будет неполным. Для лучшего знакомства, чем это, могу порекомендовать только Cats Kleisli и sanj.ink (автор картинки выше)
4–9.
Этот пример начинается с нескольких функций, анализирующих и взаимодействующих, которые переходят от примитивного типа (String, Int) к типу высокого порядка (Option[Int ], Option[Double]). Все идет нормально.
10–13.
Основные примеры использования этих функций.
16.
Вот тут и начинается проблема. Если вы хотите составить обе функции, вы не можете использовать compose или даже делать это как переменную, как исходные. Вместо этого вы должны объявить функцию и начать вложение flatMaps, что сильно ухудшает читабельность.
21.
Вот как объявляется Kleisli: тип с тремя параметрами типа и функцией «run». Что это означает? Легкий! Он инкапсулирует функцию, которая получает аргумент типа A и возвращает тип F[B], A=› F[B]. Вскоре мы увидим, почему это здорово.
22.
Эта функция аналогична функции в строке 4, но объявлена как тип Kleisli. Обязательный аргумент run объявлен как анонимная функция, которая получает строку S и возвращает Option[Int].
25.
Конечно, параметр run может быть уже существующей функцией.
28–31
Использование переменной типа Kleisli точно такое же, как если бы это была стандартная функция.
33.
Kleisli хорош тем, что предоставляет множество полезных инструментов. Например, andThen обеспечивает композицию. В этом случае andThen обеспечивает композицию, поэтому полученная составная функция может быть объявлена как переменная, как и исходные.
35–36
В качестве примечания, функцию run можно выполнить явно или путем ее вызова.
После этого краткого введения в Kleisli — опять же, не забудьте проверить Cats Kleisli и sanj.ink для лучшего описания — в следующих постах я покажу некоторые из более мощных возможностей этого класса и как мы их используем. это в реальных приложениях.
РЕДАКТИРОВАТЬ: я написал вторую статью, в которой рассказывается об использовании этого в реальном мире: Применение Scala Kleisli в реальном мире: внедрение зависимостей
РЕДАКТИРОВАТЬ 2: еще один: Реальные приложения Scala Kleisli: конфигурация