在《计算机程序的构造和解释》(SICP)第2.2.3节中,使用以下语法定义了几个函数:
(accumulate cons nil
(filter pred
(map op sequence)))
两个例子利用这个函数来操作斐波那契数列,分别是
even-fibs
和list-fib-squares
。累加、筛选和映射函数也在2.2节中定义。让我困惑的是作者为什么在这里包含了
accumulate
。accumulate
有三个参数:
要应用的二元函数
一个初始值,用作函数的最右参数
将要应用函数的列表
accumulate
应用于列表的示例: (accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
由于第三个参数是列表,(accumulate cons nil some-list)
将返回 some-list
,在这种情况下,(filter pred (map op sequence))
的结果是一个列表。
除了与本节中其他类似结构的函数保持一致外,是否有其他使用 accumulate
的原因?
(accumulate cons nil ...)
] is effectively a no-op”。但在(let ((cons +) (nil 0))
下,(accumulate cons nil ...)
将会完全不同。 - Will Ness