12

我正在寻找一种在 ST-Monad 中并行运行两个计算的方法。我正在构建一个相当大的数组(使用 STUArray),我想并行进行。

到目前为止,我已经在 stackoverflow 上找到了这个这个问答,但是第一个不适用于我的情况,因为它只处理纯代码,第二个处理 IO monad - 但我在一个状态线程中。

我还找到了monad-parallel包,但它要求我有一个 ST 的“MonadParallel”实例。monad-par包也只支持纯计算或 IO monad。

有没有办法在 ST 内部进行并行一元计算?

4

2 回答 2

7

首先,你的问题只有两个词:并行和数组 - 我必须建议你看看repa。您还应该查看Data Parallel Haskell,因为它有望成为 Haskell 道路上的下一个重要里程碑,并且有一些伟大的人参与了这个项目。

关于您的具体问题,有些库能够完全按照您的要求完成,只需使用IOmonad、已经命名的monad-parallelasync withmapConcurrently。您是否考虑过使用stToIO逃到IO

还有一个提升的异步库,它扩展了标准版本以使用MonadBaseControl,它有一个实例ST,所以你可以使用它的版本,mapConcurrently或者至少使用它作为实现你自己的灵感。

于 2013-04-12T11:45:01.673 回答
3

我不确定您是否可以安全地并行化 ST monad,或者这是否有意义,因为通常情况下,状态 monad 中的计算取决于状态,这是先前计算的结果。

但是,您可以做的是从列表中创建数组,并且列表创建很容易并行,例如通过类似并行parMap的东西。

向我们提供有关如何创建数组数据的更多详细信息可能有助于为您提供更好的答案。

于 2013-04-12T09:36:17.113 回答