因此,为此您可能需要使用折叠,例如foldl.
一般来说,在决定是使用map还是折叠时(这里我将 fold 表示为foldl或foldr),您可以使用以下经验法则:
如果您想要的列表与您进入的列表具有完全相同数量的元素,您可能需要一个map. 否则,你会想要弃牌。
推理如下:对于列表中的每个元素,map在输出中生成一个转换后的元素。另一方面,折叠更通用,可以做任何你想做的事情。(而且您确实可以map使用折叠来实现。这并不意味着您当然不需要使事情变得不必要地复杂)
为了完整起见,让我简要解释一下折叠的工作原理。折叠遍历列表(foldl从左到右foldr,因此是名称),一次在累加器中建立一个结果。
让我们看一个例子:
foldl (fn (e, a) => e + a) 0 [5, 3, 7, 10]
这e是我们当前正在使用的元素,以及a累加器变量(即当前结果)。我们从 开始a = 0,因为我们指定0为起始值。
| e | a | new a
-------------------------
| 5 | 0 | 5 + 0 = 5
| 3 | 5 | 3 + 5 = 8
| 7 | 8 | 7 + 8 = 15
| 10 | 15 | 10 + 15 = 25
| | 25 |
这给了我们一个 final a,25我们看到该函数总结了列表中的元素。请注意,在任何迭代中, 的值a是迄今为止列表中元素的总和,以及我们如何在每个步骤中扩展此列表以包含更多元素。
这是我推荐的解决此问题的方法。
- 考虑
a应该是什么基础值。[](与getting as input的结果相同。)
- 然后考虑如何从较小的列表中获取结果,并将其扩展为包含另一个元素。