Состав функции, стрелка Клейсли и монадические законы
После прочтения этой статьи я понимаю, что >=>
(Kleisli arrow) - это просто функция более высокого порядка для создания функций, возвращающих "монадические значения". Например:
val f: A => M[B] = ...
val g: B => M[C] = ...
val h: A => M[C] = f >=> g // compose f and g with Kleisli arrow
Он выглядит как простой состав "простых" функций (т.е. чистых функций, возвращающих простые значения):
val f: A => B = ...
val g: B => C = ...
val h = f andThen g; // compose f and g
Теперь я думаю, что этот "простой" состав andThen
соответствует некоторым законам
- Идентичность:
f andThen g == g
и g andThen f == g
для функции идентификации: f[A](a:A):A = a
- Ассоциативность:
(f1 andThen f2) andThen f3
== f1 andThen (f2 andThen f3)
И теперь мои вопросы:
- Соответствует ли
>=>
тем законам, где identity f(a:A) = M[a].unit(a)
?
- Можем ли мы получить монадические законы из этих законов? Соответствуют ли эти законы и монадические законы?
Ответы
Ответ 1
То, что у вас есть, является непосредственным следствием того, что эта конструкция является category.
- Да, они соответствуют друг другу. И то, что они соответствуют, действительно является причиной того, что они называются Клейсли, потому что стрелы Клейсли плюс типы образуют категорию Клейсли монады (к которой рождается каждая монада). Именно поэтому
unit
называется так: это единица под композицией стрелок Клейсли.
- Да, они могут быть получены. Используйте преобразование
(f <=< g) x = f =<< (g x)
(где <=<
есть andThen
, а =<<
, вероятно, что-то вроде flip(bind)
в Scala). Точные шаги деривации можно найти здесь.