Подтвердить что ты не робот

Это просто совпадение, что Kleisli, ReaderT и Reader в Scalaz одинаковы

В Scalaz

  • Kleisli[F, A, B] является оберткой для A => F[B].
  • ReaderT[F, A, B] - преобразователь монада-конвертера - это просто псевдоним Kleisli[F, A, B].
  • Reader[A, B] Монада - это специализация ReaderT с тождеством monad Id:
    type Reader[A, B] = ReaderT[Id, A, B].

Это просто совпадение или есть некоторые более глубокие причины, по которым Kleisli, ReaderT и Reader являются изоморфными в Scalaz?

4b9b3361

Ответ 1

Вы можете думать о нем как о прибытии в одно и то же место двумя разными путями. С одной стороны вы начинаете с монады-читателя, которая является просто своего рода оболочкой для функций. Затем вы понимаете, что хотите интегрировать эту функцию читателя в большую монаду с другими "эффектами", поэтому вы создаете монадный трансформатор ReaderT. В этот момент имеет смысл реализовать ваш оригинальный Reader[E, ?] как ReaderT[Id, E, ?].

С другой стороны, вы хотите, чтобы тип представлял стрелки Kleisli (т.е. функции с монадическим типом возврата). Оказывается, это то же самое, что и ReaderT, поэтому вы просто делаете это псевдоним.

Там нет ничего страшного таинственного в части "получится". Это немного похоже на то, что вы начали с класса типа Addable для числовых вещей, а затем решили сделать его более универсальным и, в конечном итоге, закончили класс типа, который просто предоставляет ассоциативную операцию с добавлением. Вы заново изобрели Semigroup! Тем не менее, вы можете сохранить имя Addable по историческим или педагогическим причинам или просто для удобства.

Что все, что происходит с Reader и ReaderT, вам не нужны эти псевдонимы, но они могут быть удобными и могут помочь улучшить ясность вашего кода.