Doseq valuta 1 x per ogni y. C'è un modo per farlo valutare 1 x per 1 anno e così via in Clojure?
-
06-07-2019 - |
Domanda
Non ero davvero sicuro di come pronunciare il nome di questo thread, quindi se puoi chiarirlo, per favore fallo
Il mio codice di esempio è questo:
(doseq [x [1 2 3] y [3 2 1]] (println (str x y)))
L'output di quel codice è:
13
12
11
23
22
21
33
32
31
nil
Comprendo che la comprensione dell'elenco e doseq valutano entrambe in questo modo. C'è un altro modo per farlo, in modo che invece di 1 elemento di x sia usato per ogni elemento di y, e così via, 1 elemento di x sia usato con 1 elemento di y e così via, in modo che l'output sia invece :
13
22
31
Mi dispiace se non sto esprimendo questo diritto, non riesco proprio a dirlo a parole.
EDIT: penso che tu possa farlo in Haskell con la comprensione dell'elenco e l'estensione del linguaggio. ParallelListComps o qualcosa del genere.
Soluzione
Puoi semplicemente farlo
(doseq [[x y] (map vector [1 2 3] [3 2 1])]
(println (str x y)))
Altri suggerimenti
(partition 2
(interleave [1 2 3] [3 2 1]))
interleave
produce una sequenza di elementi alternati dalle sequenze date e partizione
raggruppa questa sequenza in sequenze di n
elementi
Questo è più succint:
(doall (map println [1 2 3] [3 2 1]))