Я заметил, что между Writer m
и Either e
монадами. Если т моноид, тоЯвляются ли монады Writer m и E e категорически двойственными?
unit ::() -> m
join :: (m,m) -> m
может быть использована для формирования монады:
return is composition: a -> ((),a) -> (m,a)
join is composition: (m,(m,a)) -> ((m,m),a) -> (m,a)
Двойной из() является ничтожным (пустым типом), двойственное продукта копроизведение. Каждому типу e может быть присвоена структура «comonoid»:
unit :: Void -> e
join :: Either e e -> e
очевидным образом. Теперь
return is composition: a -> Either Void a -> Either e a
join is composition: Either e (Either e a) -> Either (Either e e) a -> Either e a
и это Either e
монады. Стрелки соответствуют точно такой же схеме.
Вопрос: Можно ли написать один общий код, который сможет выполнять как Either e
, так и как Writer m
в зависимости от заданного моноида?
Спасибо! Именно эта конструкция, я отправил код. – sdcvvc