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