Doseq auswertet 1 x für jeden y. Gibt es eine Möglichkeit, es bewerten 1 x 1 y und so weiter in Clojure zu machen?
-
06-07-2019 - |
Frage
ich nicht wirklich sicher war, wie der Name Begriff dieses Threads, also wenn Sie es jede klären können, tun Sie dies bitte.
Mein Beispiel-Code ist dies:
(doseq [x [1 2 3] y [3 2 1]] (println (str x y)))
Die Ausgabe dieses Codes ist:
13
12
11
23
22
21
33
32
31
nil
Ich verstehe, dass Listenkomprehensionen und doseq beide bewerten wie diese. Gibt es eine andere Möglichkeit, dies zu tun, so dass anstelle von 1-Element von x für jedes Element von y verwendet wird, und so weiter, 1 Element von x mit 1 Elemente von y und so weiter, so dass die Ausgabe stattdessen wäre :
13
22
31
Sorry, wenn ich dieses Recht nicht formulieren, ich kann es einfach nicht in Worte zu fassen scheinen recht.
EDIT: Ich denke, man kann dies mit Listenkomprehensionen und eine Spracherweiterung in Haskell zu tun. ParallelListComps oder so etwas.
Lösung
Sie können einfach tun
(doseq [[x y] (map vector [1 2 3] [3 2 1])]
(println (str x y)))
Andere Tipps
(partition 2
(interleave [1 2 3] [3 2 1]))
interleave
ergibt eine Folge von Elementen aus den vorgegebenen Sequenzen und partition
Gruppen diese Sequenz in Sequenzen von n
Elementen abwechseln.
Das ist kurz und knapp:
(doall (map println [1 2 3] [3 2 1]))