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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top