在Haskell中,class Monad声明为:
class Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
return = pure
Run Code Online (Sandbox Code Playgroud)
我怎样才能证明Monadis实际上Applicative是这样声明的?
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
具体来说,我怎么能写pure并<*>在以下方面return和>>=?
我怎样才能证明Monadis实际上Functor是这样声明的?
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
具体来说,我该如何fmap用return和写>>=?
这些都在文档中。
具体来说,我该如何写
pure以及<*>就收益和而言>>=?
请参阅http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#t:Monad,特别是以下部分:
此外,Monad操作和应用操作应与以下内容相关:
Run Code Online (Sandbox Code Playgroud)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 >>=?
由于这些法律,的
Functor实例f将满足Run Code Online (Sandbox Code Playgroud)fmap f x = pure f <*> x
这当然,使用什么我上面引述的,可以用来实现fmap来讲return和>>=。
正如@duplode所指出的那样,Monads也有liftM,而Applicatives也有liftA,它们是(本质上,虽然没有按字面意义定义)fmap专门用于其特定类型类的同义词。