Given the following from fp-course:
class Functor f where
(<$>) ::
(a -> b)
-> f a
-> f b
class Functor f => Extend f where
(<<=) ::
(f a -> b)
-> f a
-> f b
I defined <$$> as so:
(<$$>) ::
Comonad f =>
(a -> b)
-> f a
-> f b
(<$$>) f fa = f <$> fa
However, I'm interested to know if there's another way to implement <$$> without using <$>. Is there? If so, please show it!
You need the extract method of Comonad; Extend isn't enough to get away without fmap.
(<$$>)
:: Comonad f
=> (a -> b)
-> f a
-> f b
f <$$> w = f . extract <<= w
This is basically how liftW is implemented in Control.Comonad.
Note also that you need <<= (or extend); extract and duplicate aren't sufficient. The situation is similar to that of Bind and Monad; you can implement fmap using >>= and pure, but not using >>= alone and not using join and pure.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With