我经常看到与纯计算(例如fib
)相关的Haskell并行策略的用法和解释。但是,我并不经常看到它与monadic构造一起使用:应用于par
或ST s
时,对IO
和相关函数的效果是否有合理的解释?这样的使用会提高速度吗?
最佳答案
IO monad中的并行性被更正确地称为“并发性”,并由forkIO
和Control.Concurrent
模块中的 friend 支持。
并行化ST monad的困难在于,ST必须是单线程的-这就是它的目的。 ST monad的一个懒惰变体Control.Monad.ST.Lazy
原则上可以支持并行评估,但是我不知道有人尝试这样做。
有一个新的用于并行评估的monad称为Eval,可以在最新版本的parallel package中找到。我建议这些天将Eval
monad与rpar
和rseq
一起使用,而不是par
和pseq
,因为它会导致更健壮和易读的代码。例如,可以编写通常的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/