2009-08-01 2 views
3

Ich war nicht wirklich sicher, wie man den Namen dieses Threads formuliert, also wenn Sie es irgendwie klären können, tun Sie es bitte.Doseq wertet 1 x für jedes y aus. Gibt es eine Möglichkeit, 1 x für 1 y usw. in Clojure auszuwerten?

Mein Beispiel-Code ist dies:

(doseq [x [1 2 3] y [3 2 1]] (println (str x y))) 

Der Ausgang dieses Codes ist:


13 
12 
11 
23 
22 
21 
33 
32 
31 
nil 

Ich verstehe, dass Listenkomprehensionen, und beide doseq wie diese zu bewerten. Gibt es einen anderen Weg, dies zu tun, so dass anstelle von 1 Element von x für jedes Element von y usw. 1 Element von x mit 1 Element von y usw. verwendet wird, so dass die Ausgabe stattdessen wäre :


13 
22 
31 

Sorry, wenn ich dieses Recht nicht bin Phrasierung, ich kann es einfach nicht richtig in Worte zu fassen scheinen.

EDIT: Ich denke, dass Sie dies in Haskell mit List Comprehensions und einer Spracherweiterung tun können. ParallelListComps oder so etwas.

Antwort

11

kann man einfach tun

(doseq [[x y] (map vector [1 2 3] [3 2 1])] 
    (println (str x y))) 
4
(partition 2 
    (interleave [1 2 3] [3 2 1])) 

interleave eine Sequenz von alternierenden Elementen von den angegebenen Sequenzen und partition Gruppen dieser Sequenz in Sequenzen von n Elementen ergibt.

1

Dieses mehr succint:

(doall (map println [1 2 3] [3 2 1])) 
Verwandte Themen