从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
但是,我很想知道是否还有另一种不用使用<$$>
来实现<$>
的方法。在那儿?如果是这样,请显示出来!
答案 0 :(得分:10)
您需要extract
的{{1}}方法;没有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
。