了解 Comonad 的 <$$>

Understanding Comonad's <$$>

鉴于 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

但是,我很想知道是否有另一种方法可以在不使用 <$> 的情况下实现 <$$>。在那儿?如果有,请出示!

您需要Comonadextract方法; Extend 没有 fmap 是不够的。

(<$$>)
  :: Comonad f
  => (a -> b)
  -> f a
  -> f b
f <$$> w = f . extract <<= w

这基本上就是 liftWControl.Comonad 中的实现方式。

另请注意,您需要 <<=(或 extend); extractduplicate 是不够的。情况类似于BindMonad;您可以使用 >>=pure 实现 fmap,但不能单独使用 >>=,也不能使用 joinpure.