(map vector '(1 2 3) '(4 5 6))
делает то, что вы хотите:
=> ([1 4] [2 5] [3 6])
Haskell нужен набор функций zipWith
(zipWith3
, zipWith4
, ...), потому что все они должны быть определенного типа ; в частности, число входных списков, которые они принимают, должно быть фиксированным. (Семейство zip
, zip2
, zip3
, ... можно рассматривать как специализацию семейства zipWith
для общего случая использования кортежей).
Напротив, Clojure и другие Лиспы имеют хорошую поддержку функций переменной арности; map
является одним из них и может использоваться для «кортежа» способом, аналогичным
для Haskell.
zipWith (\x y -> (x, y))
Идиоматический способ построения «кортежа» в Clojure - это создание короткого вектора, как показано выше.
(Просто для полноты обратите внимание, что Haskell с некоторыми базовыми расширениями допускает функции переменной arity; однако для их использования требуется хорошее понимание языка, и ванильный Haskell 98, вероятно, вообще не поддерживает их, поэтому фиксированная arity функции предпочтительнее для стандартной библиотеки.)