2011-07-04 62 views
5

我想編寫一個策略來並行地評估數組中的項目。舊的策略有parArr這樣做(see here)。但是在新的Control.Parallel.Strategies模塊中沒有找到。如何編寫Haskell數組策略

E.g. 平行清單評價:map f myList `using` parList rdeepseq

我希望能夠做一些事情,如:amap f myArr `using` parArr rdeepseq,其中amap是Data.Array.Base和適用的功能,每一個元素(按順序)的。

以下似乎工作,但我不知道它是否做得對,並想知道我可以如何定義我自己的parArr

這工作:amap ((+1) `using` rpar) $ Array.array (0,4) [(0,10),(1,20),(2,30),(3,40),(4,50)]

+0

@ dave4420:感謝您的編輯:-) – vis

+3

您確定這有效嗎?因爲'(+1)'使用'rpar''很奇怪。它會並行評估'(+1)'表達式,這沒有什麼意義,因爲'(+1)'是一個lambda表達式,因此它已經在WHNF中,並且沒有什麼可以評估的。你可能意思是''amap((''使用'rpar)。(+ 1))'',不是? – Rotsor

+4

爲什麼不使用'repa'或'vector',它們已經具有並行策略,並且通常更靈活? –

回答

4

對於previous question,我寫了一個並行評估戰略矢量包。那應該是一個很好的開始。您可以在vector-strategies包中使用see the code on hackage

我沒有時間給出完整的答案 - 也許我會稍後再編輯它。隨意評論額外的問題和方向。

+0

這給了我一個寫作策略的好主意。還有一個鏈接到github,它顯示瞭如何在普通數組上使用'parTraversable'。在我的情況下,這應該給我的預期的行爲。 – vis

2

除了給出的所有好建議之外:沒有parArr的原因就是它已被替換爲更一般的parTraversable。只要說:

amap f myArr `using` parTraversable rdeepseq 

這應該給你你所要求的行爲。

+0

感謝Peter,讓我意識到'parTraversable'只做我期望的'parArr'做的工作。 +1 – vis