Question
Structure et interprétation des programmes informatiques (SICP) Section 2.2.3 sont définies plusieurs fonctions en utilisant:
(accumulate cons nil
(filter pred
(map op sequence)))
Deux exemples qui font usage de cette opérer sur une liste des numéros de fibonacci, even-fibs
et list-fib-squares
.
L'accumulation, des fonctions de filtre et la carte sont définis dans la section 2.2 ainsi. La partie qui me confondant est la raison pour laquelle les auteurs ont inclus le accumulate
ici. accumulate
prend 3 paramètres:
-
Une fonction binaire à appliquer
-
Une valeur initiale, utilisée en tant que paramètre le plus à droite à la fonction
-
Une liste à laquelle la fonction sera appliquée
Un exemple d'application Accumuler à une liste en utilisant la définition dans le livre:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
Depuis le troisième paramètre est une liste, (accumulate cons nil some-list)
va simplement revenir some-list
, et dans ce cas le résultat de (filter pred (map op sequence))
est une liste.
Y at-il une raison pour cette utilisation de accumulate
autre que la cohérence avec d'autres fonctions de structure similaire dans la section?
La solution
Je suis certain que ces deux utilisations de accumulate
sont simplement illustratifs du fait que « consing éléments pour construire une liste » peut être considérée comme un processus d'accumulation de la même manière que « la multiplication de nombres pour obtenir un produit » ou " la somme des nombres pour obtenir un total » peut. Vous avez raison que l'accumulation est effectivement un non-op.
(En plus:. Notez que cela pourrait évidemment être une opération plus utile si la sortie de filter
et entrée de accumulate
était pas une liste, par exemple, si elle représente une séquence générée paresseusement)