Haskell LYHFGG:“是的;单子只是支持>&燃气轮机=&引用;。这句话在什么意义上是正确的?

Haskell LYHFGG:“是的;单子只是支持>&燃气轮机=&引用;。这句话在什么意义上是正确的?,haskell,monads,applicative,category-theory,Haskell,Monads,Applicative,Category Theory,在本文中,作者指出“单子只是支持>>=的应用函数” (见下图)。 如果我看一看这个词的定义,我不明白这句话怎么可能是真的 Monad类型类似乎与类型类没有任何关系,例如Monad类型类不是Applicative的子类型。所以很明显,从技术上讲,在Haskell中,monad和Applicative functor是完全独立的类型类。因此,如果作者的陈述是正确的,那么它必须在不同的上下文中是正确的 有人能解释一下作者这句看似不真实的话是什么意思吗 他的声明应该如何解释?在什么情况下?也许是在范畴理

在本文中,作者指出“单子只是支持>>=的应用函数” (见下图)。 如果我看一看这个词的定义,我不明白这句话怎么可能是真的

Monad类型类似乎与类型类没有任何关系,例如Monad类型类不是Applicative的子类型。所以很明显,从技术上讲,在Haskell中,monad和Applicative functor是完全独立的类型类。因此,如果作者的陈述是正确的,那么它必须在不同的上下文中是正确的

有人能解释一下作者这句看似不真实的话是什么意思吗

他的声明应该如何解释?在什么情况下?也许是在范畴理论的背景下

换句话说: 我不明白如何将任何给定的单子转换为应用函子。因为如果作者的陈述是真的,那么每个单子都可以机械地(通过使用算法)转换成一个应用函子。但这真的有可能吗?如果是,如何进行


您是对的,该语句意味着您可以编写一个应用程序实例,而您只知道您的类型构造函数是monad。如果M是单子,那么您可以写:

instance Applicative M where
  pure = return
  mf <*> mx =
    mf >>= \f ->
      mx >>= \x ->
        return (f x)
实例应用程序M其中
纯=返回
mf mx=
mf>>=\f->
mx>>=\x->
返回(f x)

实际上,从GHC 7.10开始,
Applicative
将是
Monad
的一个超类,这意味着“Monad是Applicative plus…”的概念将在标准库中烘焙。

作者完全正确

所以很明显,从技术上讲,在Haskell中,monad和Applicative functor是完全独立的类型类

事实上,
Monad
应该是
Applicative
的“子类”。它可能会在Haskell 2014年标准化。每个人都同意,从一开始就不这样做是错误的

我们知道
Monad
是一个Monad,如果它定义了:

  • 返回
  • >=
  • >
    (可以从
    >=
    返回中派生)
我会故意把
失败
放在一边


您可以看到,
Applicative
定义了与
return
相同的
pure
,以及与
>
相同的
*>
。因此,唯一剩下的区别是
>=

的定义是的,这确实是可能的,正如对这个问题的回答所述:。非常感谢您解决了这个困惑
Monad
Applicative
的一个子类,如果您想更新答案的话。