Понимание Comonad's <$$> - PullRequest
       24

Понимание Comonad's <$$>

0 голосов
/ 23 января 2019

Учитывая следующее из 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

Я определил <$$> так:

(<$$>) ::
  Comonad f =>
  (a -> b)
  -> f a
  -> f b
(<$$>) f fa = f <$> fa

Однако мне интересно знать, есть ли другой способ реализовать <$$> без использования <$>. Есть? Если это так, пожалуйста, покажите это!

1 Ответ

0 голосов
/ 23 января 2019

Вам нужен 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.

...