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

jhe*_*dus 2 monads haskell category-theory applicative

LYHFGG中,作者声称" Monads只是支持>> = "的应用函子(见下图).如果我看一下Monad类型的定义,我不会看到这个陈述是如何成真的.

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

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

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

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

在此输入图像描述

Tar*_*mil 14

你是对的,声明意味着当你所知道的是你的类型构造函数是一个monad时,你可以编写一个Applicative实例.如果M是monad,那么你可以写:

instance Applicative M where
  pure = return
  mf <*> mx =
    mf >>= \f ->
      mx >>= \x ->
        return (f x)
Run Code Online (Sandbox Code Playgroud)

实际上,从GHC 7.10开始,Applicative将是一个超类Monad,意味着"Monad是Applicative plus ..."的概念将在标准库中出现.


Sho*_*hoe 9

作者是完全正确的.

所以很明显,从技术上讲,在Haskell中,Monads和Applicative仿函数是完全独立的类型.

实际上,Monad应该是一个"子类"了Applicative.它已被提议并且可能在Haskell 2014中被标准化.每个人都同意,从一开始就不这样做是错误的.

我们知道a Monad如果它定义了a 是monad:

  • return
  • >>=
  • >>(可以源自>>=return)

我会fail故意放下一边.

你可以看到Applicative,除了其他之外,它定义了pure哪个return,和*>哪个相同>>.因此唯一剩下的区别就是定义>>=.