Doseq avalia 1 x para cada y. Existe alguma maneira de fazê-lo avaliar 1 x para 1 y e assim por diante em Clojure?
-
06-07-2019 - |
Pergunta
Eu não estava realmente certo como expressar o nome deste segmento, por isso, se você pode esclarecer qualquer, faça-o.
Meu código exemplo é o seguinte:
(doseq [x [1 2 3] y [3 2 1]] (println (str x y)))
A saída desse código é:
13
12
11
23
22
21
33
32
31
nil
Eu entendo que compreensões lista, e doseq tanto avaliar como esta. Existe outra maneira de fazer isso, de modo que em vez de 1 elemento de x que está sendo usado para cada elemento de y, e assim por diante, um elemento de x é usado com um elemento de y e assim por diante, de modo que a saída, ao invés, ser :
13
22
31
Desculpe se eu não estou fraseado esta razão, eu simplesmente não consigo colocar em palavras direito.
EDIT: Eu acho que você pode fazer isso em Haskell com compreensões de lista e uma extensão da linguagem. ParallelListComps ou algo assim.
Solução
Você pode simplesmente fazer
(doseq [[x y] (map vector [1 2 3] [3 2 1])]
(println (str x y)))
Outras dicas
(partition 2
(interleave [1 2 3] [3 2 1]))
interleave
produz uma sequência alternada de elementos a partir das sequências dadas e grupos partition
esta sequência em sequências de elementos n
.
Este é mais sucinto:
(doall (map println [1 2 3] [3 2 1]))