如果我有一个函数进行四次非常长的计算并返回一个包含四次计算结果的列表,但是每个计算不依赖于另一个,你如何在 Haskell 中“并行化”它?
为了更好地解释我的问题,这是我想到的 Clojure 示例:
(defn some-function [arg1 arg2 arg3 arg4]
let [c1 (very-long-computation arg1)
c2 (very-long-computation arg2)
c3 (very-long-computation arg3)
c4 (very-long-computation arg4)]
[c1 c2 c3 c4])
您可以生成三个额外的线程,例如:
(defn some-function [arg1 arg2 arg3 arg4]
let [c1 (future (very-long-computation arg1))
c2 (future (very-long-computation arg2))
c3 (future (very-long-computation arg3))
c4 (very-long-computation arg4)] ; no need to wrap c4 in a future
[@c1 @c2 @c3 c4])
类似于 Haskell 中的内容是否是等价的?
someFunction :: (a -> a -> a ->a) -> [a]
do c1 <- rpar (very-long-computation arg1)
c2 <- rpar (very-long-computation arg2)
c3 <- rpar (very-long-computation arg3)
c4 <- (very-long-computation arg4)
rseq c1
rseq c2
rseq c3
return (c1, c2, c3, c4)
我需要 rpar/rseq c4 吗?
rpar/rseq 是进行这种并发计算的方式吗?
如果我不 rseq,稍后当我尝试访问返回的列表中的返回值时,程序会等待吗?
这是透明的,还是您需要在使用“@”时执行 Clojure 中发生的“deref”之类的操作?