[英]Haskell - Parallel list to tuples
我有一个功能,可以将列表转换为元组列表,其中每个键的值均为1。 我想通过使用并行性来做到这一点。 应该par
的pseq
在parMap
功能或main_
?
parMap :: [String] -> [(String, Int)]
parMap [] = []
parMap (k:xs) = do
b <- par (k, 1)
bs <- parMap xs
return (b:bs)
map_ :: [String] -> [(String, Int)]
map_ [] = []
map_ (k:xs) = (k, 1) : map_ xs
main_ = do list <- getWords "test.txt"
print $ M.toList $ reduce $ group $ map_ list
您的定义非常parMap
这种定义parMap
:
parMap :: (a -> b) -> [a] -> Eval [b]
parMap f [] = return []
parMap f (a:as) = do
b <- rpar (f a)
bs <- parMap f as
return (b:bs)
要使用它,请在生成的Eval
单子上调用runEval
,例如:
main = do list <- getWords "test.txt"
let pairs = runEval $ parMap (\x -> (x,1)) list
...
更新:看起来rpar
和rseq
只是将par
和pseq
用作monad的另一种方法。 我之所以使用它,是因为它们在Haskell中的Parallel and Concurrent Programming和parconc软件包中有很好的记录。 您也许还可以在网上免费找到本书内容的较早版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.