Haskell 函数monad真的提供了比函数applicative functor更多的东西吗?如果是,什么?

Haskell 函数monad真的提供了比函数applicative functor更多的东西吗?如果是,什么?,haskell,functional-programming,monads,applicative,combinatory-logic,Haskell,Functional Programming,Monads,Applicative,Combinatory Logic,对于monad函数,我发现()和(>>=)/(=a)->(r->b) (=b)->(r->a)->(r->b) 因此它就像()和(>>=)/(=>=id),对于归结为\fx->fx的函数monad,也就是说,一个二进制函数是通过将后者的一个参数作为前者的两个参数来输入一元的 我可以用()来表达它吗?嗯,实际上我想我可以:翻转($)f===join f对吗?flip($)f不是一个join的实现吗?它没有(>>=)/(=edit2:问题是它很模糊。它使用了一个概念(“更强大”)这完全没有定义,让

对于monad函数,我发现
()
(>>=)
/
(=a)->(r->b)
(=b)->(r->a)->(r->b)
因此它就像
()
(>>=)
/
(=>=id)
,对于归结为
\fx->fx
的函数monad,也就是说,一个二进制函数是通过将后者的一个参数作为前者的两个参数来输入一元的

我可以用
()
来表达它吗?嗯,实际上我想我可以:翻转($)f===join f对吗?
flip($)f
不是一个
join
的实现吗?它没有
(>>=)
/
(=edit2:问题是它很模糊。它使用了一个概念(“更强大”)这完全没有定义,让读者猜测它的含义。因此,我们只能得到毫无意义的答案。当然,任何东西都可以在使用哈斯克尔的所有武器库时进行编码。这是一个空洞的陈述。这不是问题

据我所知,一个明确的问题是:分别使用Monad/Applicationive/Functor中的方法作为基本体,而根本不使用显式模式匹配,这是一类计算,因此对于使用中的一组或另一组基本体,可以严格地表示为更大的计算。现在可以有意义地回答这一问题

函数是不透明的。无论如何,没有模式匹配。如果不限制我们可以使用什么,问题也就没有意义了。然后,限制变成了,显式使用命名参数,编程的有意义风格,因此我们只允许自己以组合式风格编码

因此,对于列表,仅使用
fmap
app
)我们就可以表达太多的计算,而将
join
添加到我们的库中确实会使其变大。而函数则不然。
join=W=CSI=flip-app-id
。结束

已经实现了
appfgx=(fx)(gx)=id(fx)(gx):(->)r(a->b)->(->)ra->(->)rb
,我已经有了
flip-appid:(->)r(r->b)->(->)rb
,我可以称它为
join
,因为类型合适。它已经存在,无论我是否编写它。另一方面,从
app fs xs:[](a->b)->[]a->[]b
,我似乎无法获得
[[]([]b)->[]b
(->)r(a->b)
中的
->
都是相同的;函数是相同的

(顺便说一句,我现在不知道如何明确地编码列表的
app
,而不实际编码
join
。使用列表理解相当于使用
concat
;而
concat
不是
join
的实现,而是
join


join f=f id
很简单,所以毫无疑问


(编辑:嗯,显然还有疑问)


(=x+1)0
将正确计算参数列表的长度,如果该列表是例如
[1,2]
。在此基础上,使用函数的一些内部知识
foo
(与
concat
使用参数列表的内部知识,通过模式匹配)但是仅仅使用一些基本的组合词,比如
flip
()
等,是不正确的。

当你实现
join
时,你使用的函数类型的知识超出了
Applicative
提供的知识。这些知识是在
($)
的使用中编码的。这就是“应用程序”运算符,它甚至是函数的核心。列表示例也会发生同样的情况:您使用的是
concat
,它基于对列表性质的了解


一般来说,如果你能使用某个单子的知识,你可以表达任何幂的计算。例如,使用
Maybe
你可以匹配它的构造函数,并以这种方式表达任何东西。当LYAH说单子比应用更强大时,它的意思是“作为抽象”,不适用于任何特定的单子。

Fyodor,您认为函数类型的知识在Will Ness的答案中编码在哪里?@Enlico
id
是一个函数。
(id)
不是一个可用于任何应用程序的多态函数。类似地,仅适用于函数
(>=id)
(id>=)
是相同的。@Bergi
id
这里类似于列表“
[]
,而不是
concat
。它的有效性正是指函数app.和mon.具有相同的功能。否则,我们在说什么,一般来说Monad比app具有更大的功能?当然它有,但这不是问题。如果你能表达
加入
[]
,我认为这意味着它们在那里也有同样的能力。“一般来说,如果你能使用特定单子的知识,你的意思是“特定的数据类型”。就像你建议使用模式匹配一样。Monad作为Monad没有模式匹配,只在数据类型上。作为Monad,它只知道
>=
return
@WillNess他说特定的Monad,函数,具有函数的全部功能。这个特定的应用程序也是如此。我开始明白你的观点,Will。我有一个lso添加了组合逻辑标签,因为它主要与您的答案相关。我不明白。
id
flip
都是特定于函数的,而不是
应用程序
界面的一部分。(好吧,
id
实际上适用于一般的
Category
s,但它仍然不是
Applicative
的一部分)@williness正如您所提到的(如果我理解正确的话)函数有双重作用:作为一种数据类型,它们形成一个monad。但它们也是对所有I类的monad操作进行编码的手段
join f = f <*> id