Клейсли против flapMap Sequencing

Проверяя определение Клейсли,

у кошек и моделирование функциональных и реактивных доменов

Однако я еще не могу понять, насколько это полезно. Если мы говорим о случае создания монадической функции, например, о функции, возвращающей монаду, то есть A = ›F [B], я не вижу, что она на самом деле добавляет к простому упорядочиванию цепочки

flatMap [A, B] (ma: F [A]) (f: A = ›F [B]): F [B]

Действительно, возможность связать вышеупомянутое похоже на

Если у вас есть функция f: A = ›F [B] и другая функция g: B =› F [C], где F - монада, то вы можете составить их, чтобы получить A = ›F [C]

В чем заключается реальная добавленная стоимость Kleisli, чего я не вижу?


person MaatDeamon    schedule 21.09.2020    source источник
comment
Взгляните на stackoverflow.com/questions/ 61899370 /   -  person Emiliano Martinez    schedule 21.09.2020
comment
Стрелки Kleisli - это функции, которые возвращают значения в контексте, и они составлены с помощью композиции Kleisli. В то время как flatmap - это приложение в контексте, композиция Kleisli - это композиция в контексте и приводит к безточечному стилевому коду.   -  person Iven Marquardt    schedule 21.09.2020
comment
Бесточечный код стиля ????   -  person MaatDeamon    schedule 21.09.2020
comment
flatMap используется для составления эффективных значений, которые Монады, Клейсли arrow используются для составления функций, которые производят эффективные значения (то есть монады). Так что это касается того, хотите ли вы составлять значения или функции; то есть такая же разница, что и y = g(f(x)) VS h = f andThen g - y = h(x).   -  person Luis Miguel Mejía Suárez    schedule 21.09.2020


Ответы (2)


Клейсли - это просто название функции формы A => F[B].

Можно сказать, что flatMap и Kleisli вращаются вокруг схожей идеи и связаны с похожими концепциями, но это не одно и то же. Ни один из них не добавляет ценности другому. Вот пример их связи:

Монада может быть определена несколькими разными, но одинаково мощными способами. Один использует unit + flatMap с его законами, определенными как:

  • закон левой идентичности:

         unit(x).flatMap(f) == f(x)
    
  • право-идентичность:

         m.flatMap(unit) == m
    
  • закон ассоциативности:

         m.flatMap(f).flatMap(g) == m.flatMap(x ⇒ f(x).flatMap(g))
    

Другой способ - использовать unit + compose, законы которого определены как:

  • закон левой идентичности:

        unit.compose(f) == f
    
  • право-идентичность:

         f.compose(unit) == f
    
  • закон ассоциативности:

         f.compose(g.compose(h)) == (f.compose(g)).compose(h)
    

В приведенных выше определениях flatMap - это старая добрая карта FlatMap, которую вы знаете:

def flatMap: F[A] => (A => F[B]) => F[B]

и compose - состав стрел Клейсли:

def compose: (A => F[B]) => (B => F[C]) => A => F[C]

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

person slouc    schedule 21.09.2020
comment
А, вы говорите, что Kleisi с Unit - это один из достаточных законов, составляющих монаду. Точно так же, как и карта закрылков и единицы измерения. - person MaatDeamon; 21.09.2020
comment
Почти. Не Клейсли, а состав Клейслис. Итак, в обоих случаях вы берете Kleisli (A = ›F [B]), но в одном случае у вас также есть F [A], и вы выполняете его flatMap, а в другом у вас есть еще один Kleisli, и вы сочиняете его. - person slouc; 21.09.2020
comment
@MaatDeamon Кстати, вы можете захотеть отредактировать свой вопрос, потому что вы никогда не цитировали определение Клейсли; вы только что сказали в «Кошках», «Функциональное и реактивное моделирование доменов». - person slouc; 23.09.2020

В дополнение к ответу, данному 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
comment
Большое спасибо за ваше подробное объяснение. Дело в том, что не всегда легко осознать ту силу, которая у вас в руках, если можно так выразиться. Итак, я каким-то образом пытался понять, где определение составной функции дает некоторое преимущество в последовательности операций с данными. Возможно, это просто синтаксис, упростить контракт для потребителя api или что-то еще. Это то, что я пытался выяснить ..... в любом случае ценный ответ! Оценен - person MaatDeamon; 22.09.2020
comment
Отличное дополнение к моему ответу! Я начал с другой стороны, используя композицию Kleislis просто как пример того, где они полезны, но теперь вы заставили меня понять, что это должно быть основным акцентом и отправной точкой при их объяснении людям. Спасибо! :) - person slouc; 28.09.2020
comment
Хех. Все мы учимся с разного опыта и с разных точек зрения, и представление информации по-разному часто бывает полезным. Никогда не знаешь, что поможет кому-то «щелкнуть». - person melston; 29.09.2020