为什么“concurrence”在Haskell中不是单子?
我正在阅读包的文档,试图找到与JavaScript的承诺类似的东西,我同时发现了为什么“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,因为
,这是实现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
实例具有相同的语义。