Почему в Скалазе нет>=> полугруппы для A => M[A]?
Это продолжение моего предыдущего вопроса
Kleisli
определяет два оператора <=<
(сочинить) и >=>
(а потом). >=>
выглядит очень естественно для меня, и я не понимаю, как <=<
может быть полезным
Более того, похоже, что нет >=>
полугруппа для A => M[A]
но <=<
полугруппа существует.
Что за этим стоит?
1 ответ
compose
(или же <=<
) немного более естественен при переводе между стилями без точек и без точек. Например, если у нас есть эти функции:
val f: Int => Int = _ + 1
val g: Int => Int = _ * 10
Мы получаем следующие эквивалентности:
scala> (f andThen g)(3) == g(f(3))
res0: Boolean = true
scala> (f compose g)(3) == f(g(3))
res1: Boolean = true
в compose
дело f
а также g
находятся в одинаковом порядке с обеих сторон уравнения.
К сожалению, вывод типа Scala часто делает andThen
(или же >=>
) удобнее, и он, как правило, более широко используется, чем compose
, Так что это тот случай, когда математические соглашения и особенности системы логического вывода в Scala расходятся. Скалаз (что не удивительно, учитывая культуру проекта) выбирает математическую сторону.