在Haskell中实现高效的并行映射和减少

时间:2016-02-13 22:08:44

标签: haskell parallel-processing

考虑到Python中的以下示例,我想知道如何在Haskell中实现同样有效且并行的代码。

Python中的第一个例子:功能映射

f = lambda x: 2*x
print map(f, [1,2,3,4])

Python中的第二个例子:functional reduce

g = lambda x,y: x*y
print reduce(g, [1,2,3,4], 1)

我希望Haskell中的并行代码能够有效地利用多核处理器。

注意:这些只是玩具的例子,我不打算加速这些玩具示例。它们只是为了说明如何实现操作符映射并与Haskell并行减少。

2 个答案:

答案 0 :(得分:1)

对于功能映射,Haskell中的等效顺序版本将是:

f x = 2*x
dxs = map f [1,2,3,4]
main = print dxs

Haskell中的并行版本将是:

import Control.Parallel.Strategies
import Control.Parallel

f x = 2*x
dxs = parMap rpar f [1,2,3,4]
main = print(dxs)

答案 1 :(得分:0)

另一种方式是

import Control.Parallel

newtype PMonoid a = PM {unPM :: a}

instance Monoid a => Monoid (PMonoid a) where
    mempty = PM mempty
    (PM a) <> (PM b) = PM (a `par` b `pseq` a <> b)

这会使foldMap平行。 (特别是,地图操作由于懒惰而获得并行性。)

你们许多人想要deepseq,但这并非必要。