123 votes

Yat-il un équivalent pour la fonction Zip en Clojure Core ou Contrib ?

En Clojure, je tiens à combiner les deux listes de donner une liste de paires,

> (zip '(1 2 3) '(4 5 6))  
((1 4) (2 5) (3 6))

En Haskell ou Ruby la fonction est appelée zip. Mise en œuvre il n'est pas difficile, mais je voulais m'assurer que je n'étais pas manquer une fonction de Base ou Contrib.

Il y a un zip de l'espace de noms dans le coeur, mais il est décrit comme donnant accès à la fermeture à Glissière fonctionnelle technique, qui ne semble pas être ce que je suis après.

Est-il une fonction équivalente pour la combinaison de 2 ou plusieurs listes, de cette façon, dans le Core?

Si il ne l'est pas, est-ce parce qu'il y a un idiomatiques approche qui rend la fonction inutiles?

212voto

Michał Marczyk Points 54179
(map vector '(1 2 3) '(4 5 6))

est-ce que vous voulez:

=> ([1 4] [2 5] [3 6])

Haskell a besoin d'une collection d' zipWith (zipWith3, zipWith4, ...), parce qu'ils ont tous besoin d'un certain type; en particulier, le nombre d'entrées des listes qu'ils acceptent doit être corrigé. ( zip, zip2, zip3, ... De la famille peut être considérée comme une spécialisation de l' zipWith de la famille pour le cas d'utilisation de tupling).

En revanche, Clojure et d'autres Lisps ont un bon support pour la variable d'arité de fonctions; - map est l'un d'entre eux et peut être utilisé pour "tupling" une manière similaire à Haskell

zipWith (\x y -> (x, y))

Le idiomatiques façon de construire un "tuple" en Clojure est de construire un court vecteur, comme affiché ci-dessus.

(Juste pour être complet, notons que Haskell avec certaines extensions de base ne permettent variable arité de fonctions; leur utilisation nécessite une bonne compréhension de la langue, mais, et la vanille Haskell 98 probablement ne les supporte pas du tout, donc fixe arité de fonctions sont à préférer pour la bibliothèque standard.)

19voto

Lambder Points 863
<pre><code></code><p>ou, plus généralement,</p><pre><code></code></pre></pre>

12voto

danlei Points 8602
(map vector [1 2 3] [4 5 6])

10voto

Arthur Ulfeldt Points 45059

pour vous donner exactement ce que vous vouliez, cartographie `` dans les deux listes vous donnera une liste de listes, comme dans votre exemple. Je pense que beaucoup de Clojurians aurait tendance à utiliser des vecteurs pour cela si cela fonctionnera avec n’importe quoi. et les entrées n’ont pas besoin d’être du même type. carte crée seqs d’eux et puis mappe le seqs donc n’importe quelle entrée de seq'able fonctionne parfaitement.

3voto

lsh Points 314

La méthode intégrée serait tout simplement la fonction « entrelacement » :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X