使用monad的并行策略

Sco*_*est 6 parallel-processing monads concurrency haskell

我经常看到Haskell的并行策略的使用和解释与纯计算有关(例如fib).但是,我并不经常看到它与monadic结构一起使用:par当应用于ST s或者IO?时,是否有合理的解释效果和相关函数?这样的使用会增加任何加速吗?

Sim*_*low 12

IO monad中的并行性更准确地称为"并发",并且由模块中的forkIO朋友支持Control.Concurrent.

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

有一个名为Eval的并行评估新monad ,它可以在并行软件包的最新版本中找到.我建议使用Eval单子与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)
Run Code Online (Sandbox Code Playgroud)