Frage

Die „Sag-Hallo-zu-der-ersten-Person“-Funktion funktioniert gut, warum funktioniert das nicht auch „Sag-Hallo-zu-jedem“?

(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"])
War es hilfreich?

Lösung

Sie wollen doseq, Clojures „foreach“:

(doseq [name names]
  (say-hello name))

map funktioniert nicht, weil es eine verzögerte Sequenz erzeugt:Bis Sie tatsächlich auf die Elemente in der Sequenz zugreifen (was hier nicht der Fall ist), wird keines davon ausgewertet und es treten keine Nebenwirkungen auf.

Eine andere Möglichkeit besteht darin, die Auswertung durch Umbrechen zu erzwingen dorun um die map.Wenn Sie darüber nachdenken, warum dies funktioniert, kann dies zu Ihrem Verständnis beitragen doseq ist hier der idiomatische Ansatz).

Andere Tipps

Wie @edbond in seinem Kommentar sagt, melden Sie den MAP FN nicht bis zum nötigen Moment, da die Karte Fn einen faulen SEQ zurückgibt.

Dies ist das Dokument von map fn Gibt eine faule Sequenz zurück, bestehend aus dem Ergebnis des Anwendens von F in das Set der ersten Elemente jedes Colls, gefolgt von dem Anwenden von F in den Set von zweiten Gegenständen in jedem Coll, bis irgendeiner der Colls ist erschöpft.Alle verbleibenden Gegenstände in anderen Colls werden ignoriert.Funktion f sollte Anzahl von Colls-Argumenten akzeptieren.

Wenn Sie sicherstellen müssen, dass die Werte in einem bestimmten Teil Ihres Codes auswerten, können Sie doAll oder dorun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top