了解Comonad的<$$>

Kev*_*ith 7 haskell comonad

鉴于以下fp课程:

class Functor f where
  (<$>) ::
    (a -> b)
    -> f a
    -> f b

class Functor f => Extend f where
  (<<=) ::
    (f a -> b)
    -> f a
    -> f b
Run Code Online (Sandbox Code Playgroud)

我定义<$$>如下:

(<$$>) ::
  Comonad f =>
  (a -> b)
  -> f a
  -> f b
(<$$>) f fa = f <$> fa
Run Code Online (Sandbox Code Playgroud)

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

dfe*_*uer 10

你需要的extract方法Comonad; Extend没有,离开是不够的fmap.

(<$$>)
  :: Comonad f
  => (a -> b)
  -> f a
  -> f b
f <$$> w = f . extract <<= w
Run Code Online (Sandbox Code Playgroud)

这基本上是如何liftW实现的Control.Comonad.

还要注意你需要<<=(或extend); extract并且duplicate是不够的.情况类似于BindMonad; 你可以fmap使用>>=和实现pure,但不能>>=单独使用而不使用joinpure.