了解Comonad的<$$>

时间:2019-01-23 03:17:46

标签: haskell comonad

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 :(得分:10)

您需要extract的{​​{1}}方法;没有ComonadExtend还远远不够。

fmap

基本上,这就是在(<$$>) :: Comonad f => (a -> b) -> f a -> f b f <$$> w = f . extract <<= w 中实现liftW的方式。

还请注意,您需要Control.Comonad(或<<=); extendextract是不够的。这种情况类似于duplicateBind的情况;您可以使用Monadfmap来实现>>=,但不能单独使用pure而不使用>>=join