我正在寻找一种在ST-Monad中并行运行两个计算的方法。我正在构建一个相当大的数组(使用STUArray),我想并行执行。
到目前为止,我发现了 这个 和 这个 这里有关于stackoverflow的问答,但是第一个不适用于我的情况,因为它只处理纯代码而第二个处理IO monad - 但我处于State Thread中。
我也找到了 单子平行 包,但它要求我为ST设置一个'MonadParallel'实例。也是 单子面值 package只支持纯计算或IO monad。
有没有办法在ST内进行并行monadic计算?
首先,你的问题只有两个字:parallel和array - 我必须建议你去看看 repA的。你也应该看看 数据并行Haskell因为它有望成为Haskell之路的下一个重要里程碑 一些伟大的人参与 有了这个项目。
关于你的具体问题,有些图书馆可以完全满足你的要求,只需要一个 IO
monad,已经命名了 单子平行 和 异步 同 mapConcurrently
。你考虑过使用吗? stToIO
逃进去 IO
?
还有一个 提升的异步 库,扩展了标准版本以便使用 MonadBaseControl
,有一个实例 ST
,所以你可以使用它的版本 mapConcurrently
或者至少将它作为实现自己的灵感。
我不确定你是否可以安全地并行化ST monad或者甚至是否有意义,因为通常,状态monad中的计算取决于状态,这是先前计算的结果。
然而,你可以做的是从列表中创建数组,并且列表创建很容易并行,例如通过类似的东西 parMap
来自 平行 包。
向我们提供有关如何创建阵列数据的更多详细信息可能有助于您获得更好的答案。