可以将foldr用作MapReduce吗?

时间:2016-12-01 23:43:06

标签: haskell mapreduce theory

我在想,当你进行MapReduce时,你正在转换你的数据主义者,然后使用reduce函数对转换后的数据做任何你想做的事情。我想我可以对foldr做同样的事情。在做foldr (filterfun . mapfun) []之类的事情时。我可以说Haskell的foldr与mapreduce相同吗?或者我错过了什么?

1 个答案:

答案 0 :(得分:8)

不完全。正如Alec的评论所指出的那样,foldr不允许重新排序或并行化。例如,如果你有

foldr (+) 0 [1,2,3,4]
那是

1 + (2 + (3 + 4))

foldr的实现不能拆分容器并分别对每一半求和,因为你只是给它一个函数a -> b -> b和一个值b。除了将它应用于元素和累加器之外,它不能对该函数执行任何操作。

foldMap :: (Foldable f, Monoid m)
        => (a -> m) -> f a -> m
另一方面,

非常mapReduce。由于Monoid约束带有关联性声明,因此您可以编写一个foldMap来减少容器的前半部分和后半部分并行,然后将它们与{{1}一起混合}。

<>的默认实现(在foldr中)实际使用Data.Foldable

foldMap

也就是说,它将每个元素转换为函数;这些函数都是组合的(组合形成一个以foldr c n xs = appEndo (foldMap (Endo . c) xs) n 作为其身份的幺半群),并将结果应用于种子。但是,你不能对中间函数做任何有用的事情!