Вам нужен extract
метод Comonad
;Extend
недостаточно, чтобы обойтись без fmap
.
(<$$>)
:: Comonad f
=> (a -> b)
-> f a
-> f b
f <$$> w = f . extract <<= w
Это, в основном, способ liftW
, реализованный в Control.Comonad
.
Обратите внимание, что вам нужно <<=
(или extend
);extract
и duplicate
недостаточно.Ситуация похожа на ситуацию Bind
и Monad
;Вы можете реализовать fmap
, используя >>=
и pure
, но не используя только >>=
и не используя join
и pure
.