加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

haskell – 使用monad的并行策略

发布时间:2020-12-15 00:58:23 所属栏目:Java 来源:网络整理
导读:我经常看到 Haskell的并行策略的使用和解释与纯计算相关(例如fib).但是,我并不经常看到它与monadic结构一起使用:当应用于ST或IO时,是否对par和相关函数的效果有合理的解释?这样的使用会增加任何加速吗? 解决方法 IO monad中的并行性更准确地称为“并发”,
我经常看到 Haskell的并行策略的使用和解释与纯计算相关(例如fib).但是,我并不经常看到它与monadic结构一起使用:当应用于ST或IO时,是否对par和相关函数的效果有合理的解释?这样的使用会增加任何加速吗?

解决方法

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

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

有一个新的monad用于并行评估,名为Eval,可以在parallel package的最新版本中找到.我建议使用带有rpar和rseq的Eval monad,而不是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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读