Haskell 我怎样才能证明‘Monad’实际上是‘Applicative’和‘Functor’?

Haskell 我怎样才能证明‘Monad’实际上是‘Applicative’和‘Functor’?,haskell,monads,Haskell,Monads,在Haskell中,类Monad声明为: class Applicative m => Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b return = pure 我如何证明Monad实际上是Applicative,声明如下 class Functor f => Applicativ

在Haskell中,类
Monad
声明为:

class   Applicative m   =>  Monad   m   where
return  ::  a   ->  m   a
(>>=)   ::  m   a   ->  (a  ->  m   b)  ->  m   b
return  =   pure
我如何证明
Monad
实际上是
Applicative
,声明如下

class   Functor f   =>  Applicative f   where
pure    ::  a   ->  f   a
(<*>)   ::  f   (a  ->  b)  ->  f   a   ->  f   b
class   Functor f   where
fmap    ::  (a  ->  b)  ->  f   a   ->  f   b

具体地说,我如何编写
fmap
,返回
>=

这些都在文档中

具体来说,我如何编写
pure
返回和
>=

具体见本节:

此外,Monad和Applicative操作应如下所示:

pure = return
(<*>) = ap
当然,使用我上面引用的内容,您可以使用
fmap
实现
return
>=


正如@duplode所指出的,对于单子和应用程序,它们(本质上,尽管它们不是这样定义的)是
fmap
的同义词,专门针对它们的特定类型类。

为了完整性,你可能想提到
liftM
liftA
。这两个词的有趣之处在于它们并不是同义词。它们是
fmap
什么是
ap
什么是
()
liftM f m1=do{x1谢谢。我怎样才能用返回和>>=?我怎样才能用返回和>>=?duplode我可以问一下你对我在上述评论中提出的问题有什么看法吗?@Tim-你试过谷歌吗?网上有很多关于这个问题的解释(包括最终的、令人钦佩的简短的
fmap f x = pure f <*> x