Я бы не сказал, что эти монады категорически двойственны, скорее, они оба созданы по следующей конструкции: дана моноидальная категория (C, otimes ;, 1) и алгебра A в C рассмотрим монаду, посылающую X в A & otimes; X. В первом случае C - это Hask, & otimes; is & times; и алгебра является моноидом, а во втором случае C является Hask, & otimes; is ∐ (Либо), а алгебра - это просто тип (каждый тип является алгеброй w.r.t. unique уникальным образом - это то, что вы называете «comonoid», хотя обычно это означает что-то еще, см. ниже). Как обычно, я работаю в воображаемом мире, где ⊥ не существует, так что & times; на самом деле продукт и так далее. Вероятно, можно уловить это общее обобщение, используя подходящий класс типов для моноидальных категорий (я слишком устал, чтобы понять, что в данный момент пытаются сделать экстра-категории в этом отношении) и, таким образом, одновременно определить Writer и Either как монады ( по модулю newtypes, возможно).
Что касается категорического двойника Writer - хорошо, это зависит от того, что вы хотите считать фиксированным, но наиболее вероятным кандидатом представляется структура comonad на (,) m без каких-либо условий на m:
instance Comonad ((,) m) where
coreturn (m, a) = a
cojoin (m, a) = (m, (m, a))
(обратите внимание, что здесь - это то место, где мы используем, что m является комоноидом, то есть у нас есть карты m & rarr; (), m & rarr; m & times; m).