Monads fmap
来自Functor
类型类.为什么comonads不需要cofmap
在Cofunctor
类中定义的方法?
Functor
定义为:
class Functor f where fmap :: (a -> b) -> (f a -> f b)
Cofunctor
可以定义如下:
class Cofunctor f where cofmap :: (b -> a) -> (f b -> f a)
所以,两者在技术上是相同的,这就是为什么Cofunctor
不存在的原因."'一般的仿函数'的双重概念仍然是'一般的仿函数'".
由于Functor
和Cofunctor
相同,monad和comonads都是通过使用来定义的Functor
.但是不要让它让你认为monad和comonad是同一个东西,它们不是.
monad被定义(简化)为:
class Functor m => Monad where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b
是否comonad(再次,简化)是:
class Functor w => Comonad where extract :: w a -> a extend :: (w a -> b) -> w a -> w b
注意"对称性".
另一件事是逆变函子,定义为:
import Data.Functor.Contravariant class Contravariant f where contramap :: (b -> a) -> (f a -> f b)
实际上,你错了:有一个!
https://hackage.haskell.org/package/acme-cofunctor