在LYHFGG中,作者声明“ Monads只是支持>> = 的应用函子 (见下图)。 如果我查看Monad type class的定义,我不会看到这句话是如何成真的。
Monad类型似乎与Control.Applicative类型类没有任何关系,例如Monad类型类不是Applicative的子类型。所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型。因此,如果作者的陈述是真的,那么在不同的背景下它必须是真的。
有人可以通过这个看似不真实的陈述来解释这位作者的意思吗?
他的陈述应如何解释?在什么情况下?在类别理论的背景下或许?
换句话说: 我不知道如何将任何给定的Monad变成Applicative functor。因为如果作者的陈述是真的,那么每个Monad都可以机械地(通过使用算法)转换为Applicative仿函数。但是真的可以这样做吗?如果是,怎么样?
答案 0 :(得分:14)
你是对的,声明意味着当你所知道的是你的类型构造函数是一个monad时,你可以编写一个Applicative实例。如果M是monad,那么你可以写:
instance Applicative M where
pure = return
mf <*> mx =
mf >>= \f ->
mx >>= \x ->
return (f x)
实际上,从GHC 7.10开始,Applicative
将成为Monad
的超类,意味着“Monad is Applicative plus ...”的概念将在标准库中出现。< / p>
答案 1 :(得分:9)
作者是完全正确的。
所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型。
事实上,Monad
应该是&#34;子类&#34; Applicative
。它has been proposed并且可能在Haskell 2014中被标准化。每个人都同意从一开始就不这样做是错误的。
我们知道Monad
如果它定义了一个monad:
return
>>=
>>
(可以来自>>=
和return
)我故意将fail
放在一边。
您可以看到Applicative
定义pure
,其中return
与*>
相同,>>
与>>=
相同}。因此,唯一剩下的区别是{{1}}的定义。