[英]LYHFGG: “Monads are just applicative functors that support >>=”. In what sense is this statement true?
在LYHFGG中 ,作者声称“ Monads只是支持>> = ”的应用函子 (见下图)。 如果我看一下Monad类型的定义,我不会看到这个陈述是如何成真的。
Monad类型似乎与Control.Applicative类型没有任何关系,例如Monad类型类不是Applicative的子类型。 所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型。 因此,如果作者的陈述是真的,那么它必须在不同的背景下成立。
有人可以通过这个看似不真实的陈述来解释这位作者的意思吗?
他的陈述应如何解释? 在什么情况下? 在类别理论的背景下或许?
换句话说:我不知道如何将任何给定的Monad变成Applicative functor。 因为如果作者的陈述是真的,那么每个Monad都可以机械地(通过使用算法)转换为Applicative仿函数。 但是真的可以这样做吗? 如果有,怎么样?
你是对的,声明意味着当你所知道的是你的类型构造函数是一个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是Applicative plus ...”的概念将在标准库中出现。
作者是完全正确的。
所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型。
事实上, Monad
应该是Applicative
的“子类”。 它已被提议并且可能在Haskell 2014中被标准化。每个人都同意,从一开始就不这样做是错误的。
我们知道Monad
是monad,如果它定义:
return
>>=
>>
(可来源于>>=
和return
) 我故意将fail
搁置一边。
您可以看到Applicative
定义了pure
,与return
相同, *>
与>>
相同。 因此唯一剩下的区别是>>=
的定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.