Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么“concurrence”在Haskell中不是单子?_Haskell_Concurrency_Promise_Monads - Fatal编程技术网

为什么“concurrence”在Haskell中不是单子?

为什么“concurrence”在Haskell中不是单子?,haskell,concurrency,promise,monads,Haskell,Concurrency,Promise,Monads,我正在阅读包的文档,试图找到与JavaScript的承诺类似的东西,我同时发现了,这是实现Functor,Applicative(Promise.all),Alternative(Promise.race)的最接近的概念。但是它没有实现Monad(Promise.then),我想知道为什么 我想这可能是因为(>>=)是一个顺序操作,它与名称同时冲突,但这是唯一的原因吗?这里还有更重要的原因吗?指出()和ap应该是等价的()for同时对LHS和RHS进行评估ap在完成LHS之前无法计算RHS,因为

我正在阅读包的文档,试图找到与JavaScript的承诺类似的东西,我同时发现了
,这是实现
Functor
Applicative
(Promise.all),
Alternative
(Promise.race)的最接近的概念。但是它没有实现Monad(Promise.then),我想知道为什么


我想这可能是因为
(>>=)
是一个顺序操作,它与名称
同时冲突,但这是唯一的原因吗?这里还有更重要的原因吗?

指出
()
ap
应该是等价的
()
for
同时对LHS和RHS进行评估
ap
在完成LHS之前无法计算RHS,因为
(>>=)
需要完成对LHS的计算,然后才能调用为其提供RHS的函数。

是的,这正是原因:Monad的整个要点是它们编码操作顺序,
并发地表达并行性,这本来就是一件无序的事情。但是并发的
实际上并不等同于jspromise。承诺不会提供并行性,只提供异步性。也许如果你描述了你的最终目标是什么,这里的人可以帮助你找到正确的解决方案。相关的GitHub问题:但是为什么我们不能让
ap=()
,ap必须由
(>>=)
实现有什么约束吗?我刚刚读了代码,并发现这可能只是一个历史问题?
ap
不在
Monad
类中。它被定义为
ap m1 m2=do{x1,所以我想知道,为什么我们不能设计一个monad,哪个应用程序是并发版本,而monad是顺序版本?为什么
()
ap
必须相等?添加这个规则的动机是什么?我想我明白了。这些规则像
pure=return
()=ap
承诺某些特定数据的
Applicative
Monad
实例具有相同的语义。