Понимание 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,

Другие вопросы по тегам