繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM