Doseq valuta 1 x per ogni y. C'è un modo per farlo valutare 1 x per 1 anno e così via in Clojure?

StackOverflow https://stackoverflow.com/questions/1216668

  •  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.

È stato utile?

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]))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top