Почему в Скалазе нет>=> полугруппы для 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 расходятся. Скалаз (что не удивительно, учитывая культуру проекта) выбирает математическую сторону.

Другие вопросы по тегам