在计算机程序的结构和解释(SICP)第2.2.3节中,使用以下定义了几个函数:
(accumulate cons nil
(filter pred
(map op sequence)))
Run Code Online (Sandbox Code Playgroud)
两个使用它的例子在斐波那契数列表上运作,even-fibs
和list-fib-squares
.
累积,滤波和映射函数也在2.2节中定义.令我困惑的部分是为什么作者包括在accumulate
这里.accumulate
需要3个参数:
要应用的二进制函数
初始值,用作函数的最右侧参数
要应用该功能的列表
使用书中的定义将累积应用于列表的示例:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
Run Code Online (Sandbox Code Playgroud)
由于第三个参数是一个列表,(accumulate cons nil some-list)
只会返回some-list
,在这种情况下,结果(filter pred (map op sequence))
是一个列表.
accumulate
除了与该部分中其他类似结构的函数的一致性之外,是否有理由使用此类函数?
我确信这两种用法accumulate
仅仅是说明"构建列表的构成要素"可以被视为累积过程,其方式与"乘以数字以获得产品"或"求和数来获取"相同.总共"可以.你是正确的,积累实际上是无操作.
(旁白:请注意,如果输出filter
和输入accumulate
不是列表,这显然可能是一个更有用的操作;例如,如果它表示一个延迟生成的序列.)