Существует ли эквивалент для функции Zip в Clojure Core или Contrib?

В Clojure я хочу объединить два списка для предоставления списка пар,

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

В Haskell или Ruby функция вызвана zip. Реализация его не является трудной, но я хотел удостовериться, что я не пропускал функцию в Core или Contrib.

В Ядре существует пространство имен zip, но оно описано как обеспечение доступа к Застежке-молнии функциональная техника, которая, кажется, не то, что я после.

Существует ли эквивалентная функция для объединения 2 или больше списков, таким образом, в Ядре?

Если нет, это, потому что существует идиоматический подход, который представляет ненужную функцию?

122
задан John Kane 6 April 2010 в 20:52
поделиться

3 ответа

(map vector '(1 2 3) '(4 5 6))

делает то, что вы хотите:

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

Haskell нужна коллекция zipWith ( zipWith3 , ] zipWith4 , ...), потому что все они должны быть определенного типа ; в частности, необходимо фиксировать количество принимаемых списков ввода. (Семейство zip , zip2 , zip3 , ... можно рассматривать как специализацию семейства zipWith для общего использования) случай кортежа).

В отличие от этого, Clojure и другие Lisp хорошо поддерживают функции переменной арности; map является одним из них и может использоваться для «кортежа» аналогично

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

в Haskell. Идиоматический способ построения «кортежа» в Clojure состоит в построении короткого вектора, как показано выше.

(Для полноты картины обратите внимание, что Haskell с некоторыми базовыми расширениями действительно допускает функции переменной арности; однако их использование требует хорошего понимания языка, а ванильный Haskell 98, вероятно, их вообще не поддерживает, поэтому фиксированная арность функции для стандартной библиотеки предпочтительнее.)

208
ответ дан 24 November 2019 в 01:23
поделиться

чтобы дать вам именно то, что вы хотели, сопоставление list между двумя списками даст вам список списков, как в вашем примере. Я думаю, что многие клоджурцы склонны использовать для этого векторы, хотя это будет работать с чем угодно. и входы не обязательно должны быть одного типа. map создает из них последовательности, а затем сопоставляет их, так что любой ввод с последовательностью будет работать нормально.

(map list '(1 2 3) '(4 5 6))
(map list  [1 2 3] '(4 5 6))
(map hash-map  '(1 2 3) '(4 5 6))
(map hash-set  '(1 2 3) '(4 5 6))
10
ответ дан 24 November 2019 в 01:23
поделиться
(map vector [1 2 3] [4 5 6])
12
ответ дан 24 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: