Хорошо, так скажем, у вас есть тип
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
, я думаю.