Haskell中的并行monad映射? 像parMapM?
我正在寻找一种在ST-Monad中并行运行两个计算的方法。 我正在构建一个相当大的数组(使用STUArray),我想并行执行它。
到目前为止,我已经在stackoverflow中找到了这个和这个问答,但是第一个不适用于我的情况,因为它仅处理纯代码,第二个处理IO monad - 但我处于状态线程中。
我还发现了monad-parallel软件包,但它要求我为ST提供一个'MonadParallel'的实例。 此外,monad-par软件包不支持纯粹的计算或IO monad。
有没有办法在ST内部进行并行单粒计算?
首先,在你的问题中只用两个词:平行和阵列 - 我必须建议你看看维修 。 另外你应该看看Data Parallel Haskell ,因为它将成为Haskell公路上的下一个巨大里程碑,并且有一些伟大的人参与了这个项目。
关于您的具体问题,有些库能够完全按照您的要求进行操作,只需使用IO
monad,即已命名的monad-parallel和具有mapConcurrently
异步 。 你有没有考虑过使用stToIO
来逃避IO
?
还有一个解除异步的库,它将标准版本扩展到MonadBaseControl
,它有一个ST
实例,所以你可以使用它的mapConcurrently
版本,或者至少用它来实现你自己的版本。
我不确定是否可以安全地并行化ST monad,或者甚至是有意义的,因为通常情况下,状态monad中的计算取决于状态,这是以前计算的结果。
然而,你可以做的是从列表创建数组,并且列表创建很容易并行,例如通过并行包中的parMap
之类的东西。
给我们一些关于如何创建阵列数据的更多细节可能会帮助您给出更好的答案。
链接地址: http://www.djcxy.com/p/68029.html上一篇: A parallel monad map in Haskell? Something like parMapM?