了解 Comonad 的 <$$>
Understanding Comonad's <$$>
鉴于 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
但是,我很想知道是否有另一种方法可以在不使用 <$>
的情况下实现 <$$>
。在那儿?如果有,请出示!
您需要Comonad
的extract
方法; Extend
没有 fmap
是不够的。
(<$$>)
:: Comonad f
=> (a -> b)
-> f a
-> f b
f <$$> w = f . extract <<= w
这基本上就是 liftW
在 Control.Comonad
中的实现方式。
另请注意,您需要 <<=
(或 extend
); extract
和 duplicate
是不够的。情况类似于Bind
和Monad
;您可以使用 >>=
和 pure
实现 fmap
,但不能单独使用 >>=
,也不能使用 join
和 pure
.
鉴于 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
但是,我很想知道是否有另一种方法可以在不使用 <$>
的情况下实现 <$$>
。在那儿?如果有,请出示!
您需要Comonad
的extract
方法; Extend
没有 fmap
是不够的。
(<$$>)
:: Comonad f
=> (a -> b)
-> f a
-> f b
f <$$> w = f . extract <<= w
这基本上就是 liftW
在 Control.Comonad
中的实现方式。
另请注意,您需要 <<=
(或 extend
); extract
和 duplicate
是不够的。情况类似于Bind
和Monad
;您可以使用 >>=
和 pure
实现 fmap
,但不能单独使用 >>=
,也不能使用 join
和 pure
.