Doseq оценивает 1 x для каждого y. Есть ли способ заставить его оценить 1 x в течение 1 года и так далее в Clojure?
-
06-07-2019 - |
Вопрос
Я не совсем уверен, как сформулировать название этой темы, поэтому, если вы можете это уточнить, сделайте это.
Мой пример кода такой:
(doseq [x [1 2 3] y [3 2 1]] (println (str x y)))
Вывод этого кода:
13
12
11
23
22
21
33
32
31
nil
Я понимаю, что список пониманий, и доза, оба оценивают так. Есть ли другой способ сделать это, чтобы вместо 1 элемента x использовался для каждого элемента y и т. Д., 1 элемент x использовался с 1 элементом y и т. Д., Так что вместо этого вывод был бы
13
22
31
Извините, если я не правильно сформулировал это, я просто не могу выразить это словами.
РЕДАКТИРОВАТЬ: Я думаю, что вы можете сделать это в Haskell с помощью списков и расширения языка. ParallelListComps или что-то.
Решение
Вы можете просто сделать
(doseq [[x y] (map vector [1 2 3] [3 2 1])]
(println (str x y)))
Другие советы
(partition 2
(interleave [1 2 3] [3 2 1]))
interleave
возвращает последовательность чередующихся элементов из заданных последовательностей, а partition
группирует эту последовательность в последовательности элементов n
.
Это более кратко:
(doall (map println [1 2 3] [3 2 1]))