Как выполнить функцию с побочными эффектами над вектором?

StackOverflow https://stackoverflow.com//questions/21069188

  •  02-01-2020
  •  | 
  •  

Вопрос

Поздороваться от первого лица работает нормально, почему бы не поздороваться со всеми?

(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"])
Это было полезно?

Решение

Вы хотите doseq, «foreach» Clojure:

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

map не работает, потому что создает ленивую последовательность:Пока вы фактически не получите доступ к элементам последовательности (чего здесь нет), ни один из них не будет оценен и побочные эффекты не возникнут.

Другой вариант — принудительно выполнить вычисление путем переноса dorun вокруг map.Размышление о том, почему это работает, может помочь вам понять (хотя doseq здесь идиоматический подход).

Другие советы

Как @edbond говорит в своем комментарии, карта Fn не оценивает до необходимого момента, потому что MAP FN возвращает ленивый SEQ.

Это документ карта fn Возвращает ленивую последовательность, состоящую из результата применения F к Набор первых элементов каждого колла с последующим применением f к множеству второго предмета в каждом колу, пока какой-либо из колл измученный.Любые оставшиеся предметы в других коллах игнорируются.Функция F должен принять количество аргументов соловков.

Если вам нужно быть уверены, что значения оцениваются в одной конкретной части вашего кода, вы можете использовать Doaall или dorun

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top