Это первая из серии статей, посвященных изучению типа данных с самым странным названием во всех языках программирования, за исключением, возможно, 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: конфигурация