我如何证明Monad实际上是Applicative和Functor?

Tim*_*Tim -2 monads haskell

在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)

具体来说,我该如何fmapreturn和写>>=

Rob*_*ond 9

这些都在文档中。

具体来说,我该如何写pure以及<*>就收益和而言>>=

请参阅http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#t:Monad,特别是以下部分:

此外,Monad操作和应用操作应与以下内容相关:

pure = return
(<*>) = ap
Run Code Online (Sandbox Code Playgroud)

并注意,这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
Run Code Online (Sandbox Code Playgroud)

这当然,使用什么我上面引述的,可以用来实现fmap来讲return>>=

正如@duplode所指出的那样,Monads也有liftM,而Applicatives也有liftA,它们是(本质上,虽然没有按字面意义定义)fmap专门用于其特定类型类的同义词。