В Clojure я хочу объединить два списка для предоставления списка пар,
> (zip '(1 2 3) '(4 5 6))
((1 4) (2 5) (3 6))
В Haskell или Ruby функция вызвана zip. Реализация его не является трудной, но я хотел удостовериться, что я не пропускал функцию в Core или Contrib.
В Ядре существует пространство имен zip, но оно описано как обеспечение доступа к Застежке-молнии функциональная техника, которая, кажется, не то, что я после.
Существует ли эквивалентная функция для объединения 2 или больше списков, таким образом, в Ядре?
Если нет, это, потому что существует идиоматический подход, который представляет ненужную функцию?
(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, вероятно, их вообще не поддерживает, поэтому фиксированная арность функции для стандартной библиотеки предпочтительнее.)
чтобы дать вам именно то, что вы хотели, сопоставление 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))