在 Haskell 中实现高效的并行映射和归约



鉴于Python中的以下示例,我想知道如何在Haskell中实现高效和并行的等效代码。

Python中的第一个示例:函数映射

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

Python中的第二个例子:函数式reduce。

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

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

注意:这些只是玩具示例,我不打算对这些玩具示例进行加速。它们只是为了说明如何实现运算符映射并与 Haskell 并行归约。

对于函数映射,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)

另一种方式是

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,但这不是必要的。

最新更新