我经常看到与纯计算(例如fib)相关的Haskell并行策略的用法和解释。但是,我并不经常看到它与monadic构造一起使用:应用于parST s时,对IO和相关函数的效果是否有合理的解释?这样的使用会提高速度吗?

最佳答案

IO monad中的并行性被更正确地称为“并发性”,并由forkIOControl.Concurrent模块中的 friend 支持。

并行化ST monad的困难在于,ST必须是单线程的-这就是它的目的。 ST monad的一个懒惰变体Control.Monad.ST.Lazy原则上可以支持并行评估,但是我不知道有人尝试这样做。

有一个新的用于并行评估的monad称为Eval,可以在最新版本的parallel package中找到。我建议这些天将Eval monad与rparrseq一起使用,而不是parpseq,因为它会导致更健壮和易读的代码。例如,可以编写通常的fib示例

fib n = if n < 2 then 1 else
        runEval $ do
           x <- rpar (fib (n-1))
           y <- rseq (fib (n-2))
           return (x+y)

关于haskell - 对monad使用并行策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4592509/

10-16 12:42