Haskell foldr可以用作MapReduce吗?

Haskell foldr可以用作MapReduce吗?,haskell,mapreduce,theory,Haskell,Mapreduce,Theory,我在想,当您执行MapReduce时,您正在转换您的数据列表,然后使用reduce函数对转换后的数据执行任何您想要的操作。我想我可以用foldr做同样的事情。当执行类似于foldr(filterfun.mapfun)[的操作时。我能说Haskell的foldr和mapreduce是一样的吗?还是我遗漏了什么?不太清楚。正如亚历克的评论所指出的,foldr不允许对缩减进行重新排序或并行化。例如,如果你有 foldr (+) 0 [1,2,3,4] 那就是 1 + (2 + (3 + 4)) f

我在想,当您执行MapReduce时,您正在转换您的数据列表,然后使用reduce函数对转换后的数据执行任何您想要的操作。我想我可以用
foldr
做同样的事情。当执行类似于
foldr(filterfun.mapfun)[
的操作时。我能说Haskell的foldr和mapreduce是一样的吗?还是我遗漏了什么?

不太清楚。正如亚历克的评论所指出的,
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
,并行减少容器的前半部分和后半部分,然后将它们与
混合在一起


foldr
(在
Data.Foldable
中)的默认实现实际上使用了
foldMap

foldr c n xs = appEndo (foldMap (Endo . c) xs) n

也就是说,它将每个元素转化为一个函数;这些函数都是组合的(组合形成一个幺半群,以
id
作为其标识),结果应用于种子。然而,您不能用中间函数做任何有用的事情

这将是一个有点简化的说法——但有点像是的。您可能感兴趣的主要区别是
foldr
从一端开始折叠,而MapReduce通常以任何顺序进行缩减。一个更好的比较方法是使用
foldMap
。作为补充说明,除非你对此有更具体的实际问题,否则我认为这个问题应该过于宽泛。