7

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

但是,我很想知道是否有另一种<$$>不使用<$>. 在那儿?如果有,请出示!

4

1 回答 1

10

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

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

这基本上是如何liftWControl.Comonad.

另请注意,您需要<<=(或extend);extract并且duplicate还不够。情况与Bindand类似Monad;您可以fmap使用>>=and实现pure,但不能>>=单独使用和不使用joinand pure

于 2019-01-23T03:49:09.993 回答