IO monad如何在Scala中简化并发?
我看了这个,从6分钟35秒开始,它提到了这个图表: 说IO Monad使并发处理变得容易。我对此感到困惑:它是如何工作的?理解的两个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
如何启用并发性(计算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 ...