鉴于以下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是不够的.情况类似于Bind和Monad; 你可以fmap使用>>=和实现pure,但不能>>=单独使用而不使用join和pure.