我最近开始学习Haskell,在我的一项任务中,我有一个练习,要求根据foldr定义地图功能,我不能为我的生活弄清楚如何做到这一点。我已经搜索了堆栈溢出的解决方案并遇到了这个问题:
How would you define map and filter using foldr in Haskell?
然而,这里的解决方案涉及使用lambdas,我还没有涉及到这一点,我认为因为这个,练习应该是没有lambdas的(尽管你永远不知道)。
我猜最让我困惑的是地图采用一元函数(例如+1),而foldr采用二元函数(例如+),我真的不知道如何使这两者一起工作。
答案 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
这应该指导您选择x
和foldr h x = map f
以便{{1}}。
答案 1 :(得分:5)
foldr
从右侧分解列表,并允许您通过计算对累积值进行处理。由于map
保留了列表的长度,因此您需要通过一个新的列表,其中包含转换后的值。
foldr
的类型为(a -> b -> b) -> b -> [a] -> b
您的累加器函数采用状态(正在构造的新列表)和当前列表元素,您需要创建一个新列表,其中包含由映射函数转换的元素。
foldr的第二个参数是初始累加器值,如果输入列表为空,这是返回的值,因此您应该能够使用它来确定它对于map函数应该是什么。