Хорошо, так скажем, у вас есть тип
newtype Dual f a = Dual {dual :: forall r. f(a -> r)->r}
Как оказывается, когда f является Comonad, Dual f является монадой (упражнение с потерей). Работает ли это наоборот?
Вы можете определить fmap ab (Dual da) = Dual $ \fb -> da $ fmap (. ab) fb и extract (Dual da) = da $ return id, но я не знаю, как определить duplicate или extend.
Возможно ли это? Если нет, то какого доказательства нет (существует ли конкретная Monad m, для которой вы можете доказать, что Dual m не является comonad)?
Некоторые наблюдения:
Dual IO a по существу Void (и Const Void является допустимым Comonad).
Dual m a для MonadPlus m - Void (просто используйте dual mzero).
Dual Reader - Env.
Dual Writer - Traced.
Dual State Store, я думаю.