给定来自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但是,我想知道是否有其他方法可以在不使用<$>的情况下实现<$$>。在那里吗?如果有,请出示!
发布于 2019-01-23 11:49:10
您需要Comonad的extract方法;没有fmap,Extend是不够的。
(<$$>)
:: Comonad f
=> (a -> b)
-> f a
-> f b
f <$$> w = f . extract <<= w这基本上就是在Control.Comonad中实现liftW的方式。
还要注意,您需要<<= (或extend);extract和duplicate是不够的。这种情况类似于Bind和Monad;您可以使用>>=和pure实现fmap,但不能单独使用>>=,也不能使用join和pure。
https://stackoverflow.com/questions/54319549
复制相似问题