В дополнение к ответу, данному slouc, я считаю полезным добавить, что я никогда не видел, чтобы термин Kleisli
использовался без добавленного к нему термина composition
. Итак, можно сказать, что реальное преимущество разделения функций Клейсли заключается в том, как они могут быть составлены.
flatMap
не является набором функций. Напротив, это последовательность операций с данными. Но композиция Kleisli (как и композиция других функций) позволяет создавать новые функции из других функций, следуя определенным правилам, как указывает slouc.
В Haskell композиция выполняется с помощью оператора точки. Итак, если f: A => B
и g: B => C
, у вас может быть:
h = g . f // h: A => C
Но если f
и g
являются функциями Клейсли (f: A => M[B]
и g: B => M[C]
), это не сработает. Здесь и вступает в игру композиция Клейсли. Вы часто видите, что он определяется как оператор «рыба», >=>
или что-то подобное. Используя состав Клейсли, вы можете получить:
h = g >=> f // h: A => M[C]
Кстати, в зависимости от языка или библиотеки порядок g
и f
в операторе рыбы может быть обратным. Но концепция все еще актуальна. Вы создаете новую функцию из двух существующих функций с помощью композиции. Позже вы можете применить эту функцию к данным и получить тот же результат, что и при последовательном применении flatMap
.
Еще одна вещь, о которой я, вероятно, должен упомянуть, заключается в том, что, поскольку функции Клейсли составляют, они образуют правильную категорию, поэтому вы также увидите термин Kleisli Category
. Это не так уж важно для разработчика ПО, но мне пришлось с этим разобраться, так как я часто видел это в документации и блогах, поэтому подумал, что передам это.
person
melston
schedule
22.09.2020
flatmap
- это приложение в контексте, композиция Kleisli - это композиция в контексте и приводит к безточечному стилевому коду. - person Iven Marquardt   schedule 21.09.2020flatMap
используется для составления эффективных значений, которые Монады, Клейслиarrow
используются для составления функций, которые производят эффективные значения (то есть монады). Так что это касается того, хотите ли вы составлять значения или функции; то есть такая же разница, что иy = g(f(x))
VSh = f andThen g
-y = h(x)
. - person Luis Miguel Mejía Suárez   schedule 21.09.2020