Композиция функций, стрелка Клейсли и монадические законы

Прочитав эту статью, я понимаю, что >=> (Стрелка Клейсли) - это просто функция более высокого порядка для составления функций, которые возвращают "монадические значения". Например:

val f: A => M [B] =...
Val g: B => M[C] = ...

val h: A => M[C] = f >=> g // составить f и g со стрелкой Клейсли

Это выглядит как простая композиция "простых" функций (т.е. чистых функций, которые возвращают простые значения):

val f: A => B =...
Val g: B => C = ...

val h = f и затем g; // сочиняем f и 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)

А теперь мои вопросы:

  • Есть ли >=> соответствовать тем законам, где идентичность f(a:A) = M[a].unit(a)?
  • Можем ли мы вывести монадические законы из этих законов? Эти законы и монадические законы эквивалентны?

1 ответ

Решение

То, что вы имеете здесь, является непосредственным следствием того, что эта конструкция является категорией.

  1. Да, они соответствуют. И то, что они соответствуют, действительно является причиной, по которой их называют Клейсли, потому что стрелки Клейсли плюс типы образуют категорию монады Клейсли (к которой приводит каждая монада). Это также почему unit называется так: это единица под состав стрел Клейсли.
  2. Да, они могут быть получены. Используйте преобразование (f <=< g) x = f =<< (g x) (где <=< является andThen, а также =<< это что-то вроде flip(bind) в Скале). Точные шаги вывода можно найти здесь.
Другие вопросы по тегам