因此,为此您可能需要使用折叠,例如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的结果相同。)
- 然后考虑如何从较小的列表中获取结果,并将其扩展为包含另一个元素。