Domanda

Struttura e Interpretazione dei programmi per elaboratore (SICP) Sezione 2.2.3 diverse funzioni sono definite utilizzando:

(accumulate cons nil 
  (filter pred
         (map op sequence)))

Due esempi che fanno uso di questo operare su un elenco di numeri di Fibonacci, even-fibs e list-fib-squares.

funzioni

??L'accumulano, filtra e della mappa sono definite nella sezione 2.2 pure. La parte che mi confonde è il motivo per cui gli autori inclusi il accumulate qui. accumulate prende 3 parametri:

  • Una funzione binaria da applicare

  • Un valore iniziale, viene utilizzata come parametro più a destra per la funzione

  • Un elenco a cui verrà applicata la funzione

Un esempio di applicazione di accumulare a un elenco utilizzando la definizione nel libro:

    (accumulate cons nil (list 1 2 3))
    => (cons 1 (cons 2 (cons 3 nil)))
    => (1 2 3)

Dato che il terzo parametro è una lista, (accumulate cons nil some-list) sarà solo tornare some-list, e in questo caso il risultato di (filter pred (map op sequence)) è una lista.

C'è una ragione per questo uso di accumulate diverso coerenza con le altre funzioni di analoga struttura nella sezione?

È stato utile?

Soluzione

Sono certo che questi due usi di accumulate sono semplicemente illustrative del fatto che "consing elementi per costruire un elenco" può essere considerata come un processo di accumulazione nello stesso modo che "moltiplicando i numeri per ottenere un prodotto" o " sommando i numeri per ottenere una lattina totale". Siete sulla strada giusta che l'accumulo è effettivamente un no-op.

(A parte:. Si noti che questo potrebbe ovviamente essere un'operazione più utile se l'uscita di filter e l'immissione di accumulate non era una lista, ad esempio, se rappresentasse una sequenza generata pigramente)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top