基本思想是,这三种方法都是将某些函数应用于列表的所有元素的方法。
Map 可能是最简单的——您只需将函数应用于列表的每个元素即可。这与其他语言中的 for-each 循环基本相同:
(map (lambda (x) (+ x 1)) '(1 2 3))
=> (2 3 4)
基本上,地图是这样的:(map f '(1 2 3))
是相同的(list (f 1) (f 2) (f 3))
.
过滤器也很简单:该函数就像仲裁器一样,决定是否保留每个数字。想象一下一个非常挑食的人浏览菜单并抱怨他不吃的东西;)
(filter (lambda (x) (equal? x 1)) '(1 2 3))
=> (1)
我认为折叠是最难理解的。更直观的名称是“累积”。这个想法是你在进行过程中“组合”列表。有一些日常使用的函数实际上是折叠——sum 就是一个完美的例子。
(foldr + 0 '(1 2 3))
=> 6
您可以将折叠视为采用函数并将其放在列表中的每个元素之间:(foldr + 0 '(1 2 3))
是相同的1 + 2 + 3 + 0
.
Fold 很特殊,因为与其他两个不同,它通常返回一个标量值——该值是列表的元素而不是列表本身。 (这并不总是正确的,但无论如何现在这样想。)
请注意,我可能没有得到完美的代码的每个细节——我只使用过不同的、较旧的方案实现,所以我可能错过了一些 Racket 细节。