如何使用foldr定义地图?

时间:2013-12-03 18:31:46

标签: haskell map variable-assignment fold

我最近开始学习Haskell,在我的一项任务中,我有一个练习,要求根据foldr定义地图功能,我不能为我的生活弄清楚如何做到这一点。我已经搜索了堆栈溢出的解决方案并遇到了这个问题:

How would you define map and filter using foldr in Haskell?

然而,这里的解决方案涉及使用lambdas,我还没有涉及到这一点,我认为因为这个,练习应该是没有lambdas的(尽管你永远不知道)。

我猜最让我困惑的是地图采用一元函数(例如+1),而foldr采用二元函数(例如+),我真的不知道如何使这两者一起工作。

2 个答案:

答案 0 :(得分:7)

foldr实际上很简单:给出一个列表(用:[]编写),如

a : (b : (c : (d : [])))

然后将foldr h x应用于:会将`h`替换为[],将x替换为a `h` (b `h` (c `h` (d `h` x)))

map f

将其与f a : (f b : (f c : (f d : []))) 对列表的比较:

h

这应该指导您选择xfoldr h x = map f以便{{1}}。

答案 1 :(得分:5)

foldr从右侧分解列表,并允许您通过计算对累积值进行处理。由于map保留了列表的长度,因此您需要通过一个新的列表,其中包含转换后的值。

foldr的类型为(a -> b -> b) -> b -> [a] -> b

您的累加器函数采用状态(正在构造的新列表)和当前列表元素,您需要创建一个新列表,其中包含由映射函数转换的元素。

foldr的第二个参数是初始累加器值,如果输入列表为空,这是返回的值,因此您应该能够使用它来确定它对于map函数应该是什么。