Вы можете думать о нем как о прибытии в одно и то же место по двум различным маршрутам. С одной стороны вы начинаете с монады-читателя, которая является просто своего рода оболочкой для функций. Затем вы понимаете, что хотите интегрировать эту функцию читателя в большую монаду с другими «эффектами», поэтому вы создаете трансформатор монады ReaderT
. В этот момент имеет смысл реализовать ваш оригинал Reader[E, ?]
как ReaderT[Id, E, ?]
.
С другой стороны, вы хотите, чтобы тип представлял стрелки Kleisli (т. Е. Функции с монадическим типом возврата). Оказывается, это то же самое, что и ReaderT
, поэтому вы просто делаете это псевдоним.
Нет ничего страшного таинственного в части «получится». Это немного похоже на то, что вы начали с класса типа Addable
для числовых вещей, а затем решили сделать его более универсальным и, в конечном итоге, получили класс типа, который просто предоставляет ассоциативную операцию с добавлением. Вы заново изобрели Semigroup
! Вы все равно можете сохранить имя Addable
, хотя, по историческим или педагогическим причинам, или просто для удобства.
Это все, что происходит с Reader
и ReaderT
-выми не нужно этих псевдонимов, но они могут быть удобны, и могут помочь улучшить ясность вашего кода.
Reader и ReaderT/Kleisli не являются изоморфными (как вы сказали, первый из них является специализацией последнего). – ZhekaKozlov
@ZhekaKozlov Спасибо. Я был не прав (не будет обновлять вопрос, хотя). – Michael