2013-04-12 96 views
11

我正在尋找一種在ST-Monad中並行運行兩個計算的方法。我正在構建一個相當大的數組(使用STUArray),我想並行執行它。Haskell中的並行monad映射?像parMapM?

到目前爲止,我發現thisthis Q &一個在這裏計算器,但先不中我的案件,不適用,因爲它只有純代碼,並與IO單子第二交易價格 - 但我在一個狀態線程。

我也發現了monad-parallel包,但它需要我有一個ST的「MonadParallel」的實例。此外,monad-par軟件包不支持純粹的計算或IO monad。

有沒有辦法在ST內進行並行單子計算?

+1

並行構建大型數組聽起來像是在純代碼而非ST中最好的做法。我不認爲你可以提供更多關於你想要在每個單元格中放置什麼的信息,以及爲什麼要使用ST?可能會出現問題,例如,如果您針對每個單元在ST monad中運行單獨的操作,那麼實際上並不能很簡單地並行執行(與IO不同),ST並不真正爲線程間的通信提供原語。 – DarkOtter

回答

7

首先,通過你的問題只有兩個字:並行和陣列 - 我必須建議你看看repa。此外,你應該檢查出Data Parallel Haskell,因爲它有望成爲哈斯克爾公路上的下一個巨大里程碑,並且該項目有some great people involved

關於您的具體問題,也有能夠做的正是你所求的圖書館,只是一個IO單子,已命名爲monad-parallelasync with mapConcurrently。你有沒有考慮使用stToIO逃到IO

還有一個lifted-async庫,它擴展了標準版本MonadBaseControl,其中有ST一個實例來工作,所以你大概可以使用mapConcurrently其版本,或者至少用它作爲靈感要實現自己的。

3

我不知道你是否可以安全地並行化一個ST monad,或者甚至是有意義的,因爲通常狀態monad中的計算取決於狀態,這是以前計算的結果。

但是,您可以做的是從列表創建數組,並且列表創建可以很容易地平行進行,例如,通過parallel包中的類似parMap

給我們一些關於如何創建陣列數據的更多細節可能會幫助您給出更好的答案。

+0

你當然可以並行化它,你只需要程序員自己處理非確定性 –