Pregunta
Estructura e Interpretación de programas de ordenador (SICP) Sección 2.2.3 varias funciones se definen usando:
(accumulate cons nil
(filter pred
(map op sequence)))
Dos ejemplos que hacen uso de esta opera en una lista de los números de Fibonacci, even-fibs
y list-fib-squares
.
El acumulan, filtra y mapa se definen en la sección 2.2 también. La parte que me está confundiendo es por eso que los autores incluyen la accumulate
aquí. accumulate
toma 3 parámetros:
-
una función binaria que debe aplicarse
-
Un valor inicial, que se utiliza como el parámetro más a la derecha a la función
-
Una lista a la que se aplica la función
Un ejemplo de aplicación se acumulan a una lista mediante la definición en el libro:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
Desde el tercer parámetro es una lista, (accumulate cons nil some-list)
acaba de regresar some-list
, y en este caso el resultado de (filter pred (map op sequence))
es una lista.
¿Hay una razón para ello uso de accumulate
distinta de la coherencia con otras funciones de estructura similar en la sección?
Solución
Estoy seguro de que esos dos usos de accumulate
son meramente ilustrativos del hecho de que "CONSING elementos para construir una lista" puede ser entendido como un proceso acumulativo de la misma manera que "números de multiplicar para obtener un producto" o " números sumando para obtener una "lata total. Tiene razón de que la acumulación es efectivamente un no-op.
(Aparte:. Obsérvese que esto podría obviamente ser una operación más útil si la salida de filter
y la entrada de accumulate
no era una lista, por ejemplo, si se representa una secuencia generada con pereza)