LYHFGG:“Monads只是支持>> =”的应用函子。这个陈述在什么意义上是真的?

时间:2014-10-04 15:18:51

标签: haskell monads applicative category-theory

LYHFGG中,作者声明“ Monads只是支持>> = 的应用函子 (见下图)。 如果我查看Monad type class的定义,我不会看到这句话是如何成真的。

Monad类型似乎与Control.Applicative类型类没有任何关系,例如Monad类型类不是Applicative的子类型。所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型。因此,如果作者的陈述是真的,那么在不同的背景下它必须是真的。

有人可以通过这个看似不真实的陈述来解释这位作者的意思吗?

他的陈述应如何解释?在什么情况下?在类别理论的背景下或许?

换句话说: 我不知道如何将任何给定的Monad变成Applicative functor。因为如果作者的陈述是真的,那么每个Monad都可以机械地(通过使用算法)转换为Applicative仿函数。但是真的可以这样做吗?如果是,怎么样?

enter image description here

2 个答案:

答案 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}}的定义。