Come posso eseguire una funzione con effetti collaterali su un vettore?
-
02-01-2020 - |
Domanda
Il say-ciao-to-first-persona funziona bene, perché non dice-ciao-a-tutti?
(defpartial greeting [name] [:p.alert "Hello " name ", how are you?"]) (defn say-hello [name] (append $content (greeting name))) (defn say-hello-to-first-person [names] (say-hello (first names))) (defn say-hello-to-everyone [names] (map say-hello names)) (say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"]) (say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"]).
Soluzione
vuoi doseq
, "Foreach" di Clojure ":
(doseq [name names]
(say-hello name))
.
map
non funziona perché produce una sequenza pigra: finché non accetti effettivamente agli elementi nella sequenza (che non sei qui), nessuno di loro verrà valutato e gli effetti collaterali non si verificano.
Un'altra opzione è quella di forzare la valutazione convochevando dorun
intorno al map
.Pensando al motivo per cui questo funziona può aiutare la tua comprensione (anche se doseq
è l'approccio idiomatico qui).
Altri suggerimenti
AS @edbond dice nel suo commento, map fn non valuta il momento necessario perché Map Fn restituisce un pigro seq.
Questo è il Doc di Mappa fn Restituisce una sequenza pigra costituita dal risultato dell'applicazione di F al Set di primi articoli di ciascun Coll, seguito dall'applicazione di F al set di secondi elementi in ogni coll, fino a quando nessuno dei colls è esausto.Eventuali articoli rimanenti in altri colli vengono ignorati.Funzione F dovrebbe accettare argomenti di numero di colls.
Se è necessario essere sicuri che i valori siano valutati in una parte specifica del tuo codice è possibile utilizzare fai o Dorun