2014-12-15 11 views
9

Sto cercando di imparare Scheme e sto facendo fatica a capire la differenza tra map e apply.Qual è la differenza tra la mappa e applica in schema?

Come ho capito, map applica la funzione a ciascun elemento dell'elenco e apply applica qualcosa agli argomenti di una procedura.

Possono essere utilizzati in modo intercambiabile?

risposta

21

Non sono la stessa cosa! I loro nomi possono effettivamente aiutare a ricordare chi fa cosa.

map prenderà come argomento una procedura e una o più liste. La procedura sarà chiamata una volta per ogni posizione delle liste, utilizzando come argomenti l'elenco degli elementi in quella posizione:

(map - '(2 3 4)) 
; => (-2 -3 -4) 

map chiamato (- 2), (- 3), (- 4) per creare l'elenco.

(map + '(1 2 3) 
     '(10 20 30)) 
; => (11 22 33) 

map chiamato (+ 1 10)(+ 2 20)(+ 3 30) per creare l'elenco.

(map * '(2 2 -1) 
     '(0 3 4) 
     '(5 4 2)) 
; => (0 24 -8) 

map chiamato (* 2 0 5)(* 2 3 4)(* -1 4 2) per creare l'elenco.

map ha quel nome perché implementa un (funzione) "mappa" su un insieme di valori (nelle liste):

(map - '(2 3 4)) 
arguments  mapping "-"  result 
    2  === (- 2) ===>  -2 
    3  === (- 3) ===>  -3 
    4  === (- 4) ===>  -4 

(map + '(1 2 3) 
     '(10 20 30)) 
arguments  mapping "+"  result 
    1 10  === (+ 1 10) ===>  11 
    2 20  === (+ 2 20) ===>  22 
    3 30  === (+ 3 30) ===>  33 

apply avrà almeno due argomenti, il primo di essi essendo una procedura e l'ultima una lista.Si chiamerà la procedura con i seguenti argomenti, compresi quelli all'interno della lista:

(apply + '(2 3 4)) 
; => 9 

Questa è la stessa (+ 2 3 4)

(apply display '("Hello, world!")) 
; does not return a value, but prints "Hello, world!" 

Questo è lo stesso di (display "Hello, world!").

apply è utile quando si dispone di argomenti come una lista,

(define arguments '(10 50 100)) 
(apply + arguments) 

Se si tenta di riscrivere l'ultima riga senza utilizzare apply, vi renderete conto che è necessario un loop all'interno di lista sommando ogni elemento. ..

apply può anche essere utilizzato con più di questi due argomenti. Il primo argomento deve essere un oggetto callable (una procedura o una continuazione). L'ultimo deve essere una lista. Gli altri (tra il primo e l'ultimo) sono oggetti di qualsiasi tipo. Quindi chiedono

(apply PROC a b c ... y z '(one two ... twenty)) 

è lo stesso di chiamare

(PROC a b c ... y z one two ... twenty) 

Ecco un esempio concreto:

(apply + 1 -2 3 '(10 20)) 
; => 32 

Questa è la stessa di (+ 1 -2 3 10 20)

apply ha quel nome perché permette per "applicare" una procedura a diversi argomenti.

+1

In Schema 'apply' prende un numero qualsiasi di argomenti, ma il primo deve essere qualcosa chiamabile (procedura o continuazione) e l'ultimo deve essere una lista. Gli argomenti in mezzo sono i primi argomenti .. '(applica l'elenco di mappe '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester

+0

@Sylwester: sì, Ho modificato il post. Grazie! – Jay

+1

Un'altra importante differenza è che la mappa restituisce sempre una lista. –

3

No, apply chiama il suo primo argomento come una procedura, con tutto il resto come i suoi argomenti, con l'ultima - elenco - aperto, vale a dire il suo contenuto "a fette in":

(apply f a b (list c d e)) == (f a b c d e) 

esempio:

(applicare + 1 2 (elenco 3 4 5))
; Valore: 15

E 'solo una chiamata; map sta infatti chiamando il suo primo argomento per ogni elemento membro del suo secondo argomento.

Un uso combinato di map e apply è il famoso transpose trucco:

(applicare Mappa list '((1 2 3) (10 20 30)))
; valore: ((1 10) (2 20) (3 30))

Problemi correlati