Понимание Comonad's <$$>
Учитывая следующее из фп-курса:
class Functor f where
(<$>) ::
(a -> b)
-> f a
-> f b
class Functor f => Extend f where
(<<=) ::
(f a -> b)
-> f a
-> f b
Я определил <$$>
как так:
(<$$>) ::
Comonad f =>
(a -> b)
-> f a
-> f b
(<$$>) f fa = f <$> fa
Тем не менее, мне интересно знать, есть ли другой способ реализации <$$>
без использования <$>
, Есть? Если это так, пожалуйста, покажите это!
1 ответ
Решение
Вам нужно 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
,