Doseq evalúa 1 x por cada y. ¿Hay alguna manera de hacer que evalúe 1 x por 1 y así sucesivamente en Clojure?
-
06-07-2019 - |
Pregunta
No estaba realmente seguro de cómo expresar el nombre de este hilo, así que si puede aclararlo, hágalo.
Mi código de ejemplo es este:
(doseq [x [1 2 3] y [3 2 1]] (println (str x y)))
La salida de ese código es:
13
12
11
23
22
21
33
32
31
nil
Entiendo esa lista de comprensiones, y doseq ambas se evalúan así. ¿Hay alguna otra manera de hacer esto, de modo que en lugar de 1 elemento de x se use para cada elemento de y, y así sucesivamente, 1 elemento de x se use con 1 elemento de y y así sucesivamente, de modo que la salida sea en su lugar :
13
22
31
Lo siento si no estoy redactando esto correctamente, parece que no puedo expresarlo con palabras correctas.
EDITAR: Creo que puedes hacer esto en Haskell con listas de comprensión y una extensión de lenguaje. ParallelListComps o algo así.
Solución
Simplemente puedes hacer
(doseq [[x y] (map vector [1 2 3] [3 2 1])]
(println (str x y)))
Otros consejos
(partition 2
(interleave [1 2 3] [3 2 1]))
interleave
produce una secuencia de elementos alternos de las secuencias dadas y partición
agrupa esta secuencia en secuencias de elementos n
.
Esto es más sucinto:
(doall (map println [1 2 3] [3 2 1]))