Mappa un elenco di funzioni in un elenco
-
11-12-2019 - |
Domanda
Questo è il compito, quindi non voglio la risposta.Ho solo bisogno di una spinta nella giusta direzione.Sono tenuto a mappare più funzioni su un elenco.Ad esempio:
(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)
.
Sono in grado di farla mappare la prima funzione agli elementi dell'elenco, tuttavia, mi sento molto perso dopo.Inoltre, poiché questo è introduttivo, sono limitato alle funzioni introduttive (const
, append
, car
, cdr
, member
, ecc.)
(define (map-multi f l)
(cond
((null? l)
l)
(else (cons ((car f) (car l))
(map-multi f (cdr l))))))
. Soluzione
È necessario Componi le funzioni che si ricevono nel parametro f
. Per la semplicità, diciamo che ci sono solo due funzioni nell'elenco, quindi è necessario applicare la prima funzione all'elemento corrente nell'elenco dei numeri e quindi applicare la seconda funzione al risultato di ciò. Se è possibile utilizzare compose
Procedura Vai avanti con esso e cambia questa riga nel tuo Codice:
.
((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?
... con questo:
.
((compose (cadr f) (car f)) (car l)) ; now we're applying both functions
Se non è possibile utilizzare compose
, quindi sostituire la stessa riga con questo:
.
((cadr f) ((car f) (car l))) ; now we're applying both functions
Ora, se il problema è più generale e è necessario mappare un elenco di funzioni con più di due elementi , quindi ancora una volta sostituisci la stessa riga nel codice con questo: .
.
((compose-multi f) (car l))
e implementare una funzione di aiutante che compone e restituisce tutte le funzioni nell'elenco, da chiamate successive a compose
. Questo è lasciato come un esercizio per te, dato che è un compito - ma se capisci come il codice di cui sopra funziona solo per due funzioni, dovrebbe essere abbastanza facile da estendere il risultato per un elenco di funzioni multiple:
.
(define (compose-multi flist) ; procedure for composing a list of functions
(if (null? flist) ; if the list is empty then
<???> ; return the identity function
(<???> (compose-multi <???>) ; else compose the result of recursive call
<???>))) ; with the current element in the list
Si noti che la funzione di identità è necessaria per la gestione del caso in cui non ci sono elementi nell'elenco delle funzioni; È molto semplice definire, restituisce solo lo stesso valore che è stato passato come parametro.
anche consapevole che compose-multi
restituisce una funzione , il risultato della composizione di tutte le funzioni nell'elenco - compose
fa questo per te, ma se non ti è permesso di usarlo, ricorda questo :
.
(compose x y)
... è equivalente a questo:
.(lambda (n) (x (y n)))
Altri suggerimenti
Potrebbe essere più facile scrivere questo come due funzioni.Si effettua un elenco di funzioni e un singolo input e applica tutte le funzioni nell'elenco in serie.L'output da un'unica applicazione sarà l'ingresso per quello successivo;Una volta che hai esaurito le funzioni che hai finito.
L'altra funzione è sufficiente mappare questa funzione di aiutante su un elenco di ingressi.
Ecco un modo alternativo per definire multi-map
che invece della composizione utilizza l'operazione chiamata fold
.Dal momento che ti è permesso solo di utilizzare le funzioni introduttive, questa non è davvero la risposta al tuo incarico.Ma sarà, se scrivi la propria definizione di fold
(non è molto lungo!)
(define (multi-map operations input)
(fold map input operations))
> (multi-map (list 1+ square)
'(4 10 8))
$2 = (25 121 81)
> (multi-map (list 1+ square 1+)
'(4 10 8))
$3 = (26 122 82)
. Per riscaldarsi, iniziare con un problema più semplice.Quindi generalizzare la soluzione.
Come scriveresti questa funzione?
(define (map-single fs x)
...)
> (map-single (list double add1) 3)
7
.
Prende un elenco, fs
, dei valori delle funzioni come argomento e un numero, x
e calcolato il valore dell'applicazione della (composizione di) funzioni in fs
a x
?