2009-08-01 3 views
3

Je n'étais pas vraiment sûr de la façon d'exprimer le nom de ce sujet, donc si vous pouvez le préciser, veuillez le faire.Doseq évalue 1 x pour chaque y. Existe-t-il un moyen de le faire évaluer 1 x pour 1 y et ainsi de suite dans Clojure?

Mon exemple de code est la suivante:

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

La sortie de ce code est:


13 
12 
11 
23 
22 
21 
33 
32 
31 
nil 

Je comprends que la liste compréhensions, et doseq comme celui-ci à la fois évalue. Existe-t-il une autre façon de faire cela, de sorte qu'au lieu de 1 élément de x utilisé pour chaque élément de y, et ainsi de suite, 1 élément de x est utilisé avec 1 élément de y et ainsi de suite, de sorte que la sortie :


13 
22 
31 

Désolé si je ne suis pas en train de formuler ce droit, je n'arrive pas à le mettre en mots correctement.

EDIT: Je pense que vous pouvez le faire dans Haskell avec une compréhension de liste et une extension de langage. ParallelListComps ou quelque chose.

Répondre

11

Vous pouvez simplement faire

(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 cède une séquence d'éléments alternant des séquences données et groupes partition cette séquence en séquences d'éléments n.

1

Ceci est plus succint:

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