Doseq оценивает 1 x для каждого y. Есть ли способ заставить его оценить 1 x в течение 1 года и так далее в Clojure? - PullRequest
3 голосов
/ 01 августа 2009

Я не совсем уверен, как сформулировать название этой темы, поэтому, если вы можете это уточнить, пожалуйста, сделайте это.

Мой пример кода такой:

(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 или что-то.

Ответы [ 3 ]

11 голосов
/ 01 августа 2009

Вы можете просто сделать

(doseq [[x y] (map vector [1 2 3] [3 2 1])] 
  (println (str x y)))
4 голосов
/ 01 августа 2009
(partition 2
  (interleave [1 2 3] [3 2 1]))

interleave дает последовательность чередующихся элементов из заданных последовательностей и partition группирует эту последовательность в последовательности из n элементов.

1 голос
/ 03 мая 2013

Это более лаконично:

 (doall (map println [1 2 3] [3 2 1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...