IO monad如何在Scala中简化并发?

IO monad如何在Scala中简化并发?,scala,concurrency,io-monad,Scala,Concurrency,Io Monad,我看了这个,从6分钟35秒开始,它提到了这个图表: 说IO Monad使并发处理变得容易。我对此感到困惑:它是如何工作的?理解的两个如何启用并发性(计算d和f)?不,它不启用并发性 对于理解只会帮助您省略几个括号和缩进 您提到的代码,翻译成[flat]map严格等同于: async.boundedQueue[Stuff](100).flatMap{ a => val d = computeB(a).flatMap{ b => computeD(b).map{ resu

我看了这个,从6分钟35秒开始,它提到了这个图表:

说IO Monad使并发处理变得容易。我对此感到困惑:它是如何工作的?理解的两个
如何启用并发性(计算
d
f
)?

不,它不启用并发性
对于
理解只会帮助您省略几个括号和缩进

您提到的代码,翻译成
[flat]map
严格等同于:

async.boundedQueue[Stuff](100).flatMap{ a => 
  val d = computeB(a).flatMap{
    b => computeD(b).map{ result =>
      result
    }
  }

  val f = computeC(a).flatMap{ c =>
    computeE(c).flatMap{ e =>
      computeF(e).map{ result =>
        result
      }
    }
  }

  d.merge(f).map(g => g)
}
看,它只会帮你省略几个括号和缩进(笑话)

并发性隐藏在
flatMap
map
一旦您了解了
for
如何转换为
flatMap
map
,就可以在它们内部实现并发性

由于
map
将函数作为参数,这并不意味着该函数是在执行
map
函数的过程中执行的,您可以将该函数推迟到另一个线程或在后者运行。这就是并发的实现方式

承诺
未来
为例:

val future: Future = ```some promise```
val r: Future = for (v <- future) yield doSomething(v)
// or
val r: Future = future.map(v => doSomething(v))
r.wait
哈斯克尔:

do {
  ...
  yielded_monad <- ```some monad``` -- shift function is >>= of the monad
  ...captured
}
do{
...
已生成单子的_monad>=个单子
…被俘
}
斯卡拉:

for {
  ...
  yielded_monad <- ```some monad``` // shift function is flatMap/map of the monad
  ...captured
} yield ...
用于{
...

单子的答案是单子合成。一旦你了解了什么是单子以及理解如何帮助你合成单子,你就会明白。我认为如果没有单子和克莱斯利箭头的详细解释,这个问题是无法真正回答的,所以它几乎超出了可以回答的范围没有写一系列的博客。
for {
  ...
  yielded_monad <- ```some monad``` // shift function is flatMap/map of the monad
  ...captured
} yield ...