问题 Haskell中的并行monad地图?像parMapM这样的东西?


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

到目前为止,我发现了 这个 和 这个 这里有关于stackoverflow的问答,但是第一个不适用于我的情况,因为它只处理纯代码而第二个处理IO monad - 但我处于State Thread中。

我也找到了 单子平行 包,但它要求我为ST设置一个'MonadParallel'实例。也是 单子面值 package只支持纯计算或IO monad。

有没有办法在ST内进行并行monadic计算?


4512
2018-04-12 08:47


起源

并行构建一个大型数组听起来像是纯代码而不是ST中最好的。我不认为您可以提供更多关于您想要放入每个单元格的信息以及您为什么要使用ST的信息?可能存在问题,例如,如果您在ST monad中为每个单元运行单独的操作,那么这实际上不能真正地并行化(因为IO)ST不会真正为线程之间的通信提供原语。


答案:


首先,你的问题只有两个字:parallel和array - 我必须建议你去看看 repA的。你也应该看看 数据并行Haskell因为它有望成为Haskell之路的下一个重要里程碑 一些伟大的人参与 有了这个项目。

关于你的具体问题,有些图书馆可以完全满足你的要求,只需要一个 IO monad,已经命名了 单子平行 和 异步 同 mapConcurrently。你考虑过使用吗? stToIO 逃进去 IO

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


7
2018-04-12 11:45





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

然而,你可以做的是从列表中创建数组,并且列表创建很容易并行,例如通过类似的东西 parMap 来自 平行 包。

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


3
2018-04-12 09:36



你当然可以将它并行化,你只需依靠程序员自己处理非确定性 - Don Stewart