我正在寻找一种在ST-Monad中并行运行两个计算的方法。我正在构建一个相当大的数组(使用 STUArray(,我想并行完成。
到目前为止,我已经在stackoverflow上找到了这个和这个问答,但是第一个不适用于我的情况,因为它只处理纯代码,第二个处理IO monad - 但我处于状态线程中。
我也找到了monad-parallel包,但它要求我有一个ST的"MonadParallel"实例。此外,monad-par 包仅支持纯计算或 IO monad。
有没有办法在 ST 内部进行并行一元计算?
首先,你的问题中只有两个词:并行和数组 - 我必须建议你看看 repa 。此外,您应该查看Data Parallel Haskell,因为它有望成为Haskell道路上的下一个巨大里程碑,并且有一些很棒的人参与了这个项目。
关于您的具体问题,有些库能够完全按照您的要求进行操作,只需使用IO
monad,已经命名的 monad-parallel 和 mapConcurrently
异步。你有没有考虑过用stToIO
逃到IO
?
还有一个提升异步库,它扩展了标准版本以使用 MonadBaseControl
,它有一个 ST
的实例,所以你可能可以使用它的 mapConcurrently
版本,或者至少使用它作为实现自己的灵感。
我不确定您是否可以安全地并行化 ST monad,或者这是否有意义,因为通常,状态 monad 中的计算取决于状态,这是先前计算的结果。
但是,您可以做的是从列表中创建数组,并且列表创建很容易并行,例如通过并行包中的parMap
之类的东西。
向我们提供有关如何创建数组数据的更多详细信息可能有助于为您提供更好的答案。