在Haskell中,class Monad
声明为:
class Applicative m => Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b return = pure
我怎样才能证明Monad
is实际上Applicative
是这样声明的?
class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b
具体来说,我怎么能写pure
并<*>
在以下方面return
和>>=
?
我怎样才能证明Monad
is实际上Functor
是这样声明的?
class Functor f where fmap :: (a -> b) -> f a -> f b
具体来说,我该如何fmap
用return
和写>>=
?
这些都在文档中。
具体来说,我该如何写
pure
以及<*>
就收益和而言>>=
?
请参阅http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#t:Monad,特别是以下部分:
此外,Monad操作和应用操作应与以下内容相关:
pure = return (<*>) = ap
并注意,这ap
是标准的Monad函数,早于Applicative被引入为该语言的标准部分,并被定义为ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }
Specifically, how can I write fmap in terms of return and >>=?
该Control.Applicative文档说:
由于这些法律,的
Functor
实例f
将满足fmap f x = pure f <*> x
这当然,使用什么我上面引述的,可以用来实现fmap
来讲return
和>>=
。
正如@duplode所指出的那样,Monads也有liftM,而Applicatives也有liftA,它们是(本质上,虽然没有按字面意义定义)fmap
专门用于其特定类型类的同义词。