use*_*006 13 monads haskell functor
Monads fmap来自Functor类型类.为什么comonads不需要cofmap在Cofunctor类中定义的方法?
J. *_*bal 22
Functor 定义为:
class Functor f where
fmap :: (a -> b) -> (f a -> f b)
Run Code Online (Sandbox Code Playgroud)
Cofunctor 可以定义如下:
class Cofunctor f where
cofmap :: (b -> a) -> (f b -> f a)
Run Code Online (Sandbox Code Playgroud)
所以,两者在技术上是相同的,这就是为什么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
Run Code Online (Sandbox Code Playgroud)
是否comonad(再次,简化)是:
class Functor w => Comonad where
extract :: w a -> a
extend :: (w a -> b) -> w a -> w b
Run Code Online (Sandbox Code Playgroud)
注意"对称性".
另一件事是逆变函子,定义为:
import Data.Functor.Contravariant
class Contravariant f where
contramap :: (b -> a) -> (f a -> f b)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1298 次 |
| 最近记录: |