我在玩並行策略並想知道我是否按照正確的方式執行下列操作。 Java代碼:如何在Haskell中使用並行策略編寫嵌套循環問題
double x = 0.0;
double[] arr = new double[2000];
for (int i = 0; i < arr.length; i++)
arr[i] = i;
for (int i = 0; i < arr.length; i++) {
x += arr[i] * 5;
for (int j = i + 1; j < arr.length; j++)
x -= arr[j] * 3;
}
它採用並行策略來計算結果
哈斯克爾程序:
n = 2000
ns = [0..n-1]
segments = chunk 100 ns
chunk n [] = []
chunk n xs = ys : chunk n zs
where (ys,zs) = splitAt n xs
parCompute = foldl' (+) 0 (map (\ts -> compute ts) segments `using` parList rdeepseq)
compute ts = foldl' addfunc 0 ts
where
addfunc acc i = (acc + x) - (foldl' minusfunc 0 [(i+1)..(n-1)])
where
x = (ns!!i) * 5
minusfunc acc' j = (acc' + x')
where
x' = (ns!!j) * 3
main = print parCompute
我的問題是:
是它的使用權與foldl」在這裏嗎?我想因爲所有計算都需要完成以獲得結果,所以我應該強制評估。
有沒有更好的方法來使用段?在這個問題中我可以利用哪些常見模式?
其他什麼策略可以應用於這個問題?此外,任何使用
par
和seq
原語進行並行化的可能性。
風格評論:嵌套wheres醜陋。 – rampion
我不認爲這些代碼是等價的。代碼「x - = arr [j] * 3」被應用於列表中位置「i」之後的所有項目,但在haskell代碼中,等價物僅應用於本地塊,而不是所有位於「i」位置的值。或者,也許我讀錯了。 –
@Tim:它給出了相同的答案。我已經檢查了Haskell對Java的結果。 – vis