1. ホーム
  2. clojure

[解決済み] Clojure CoreやContribでZip関数に相当するものはありますか?

2022-06-09 07:09:02

質問

Clojureで、2つのリストを組み合わせてペアのリストを作りたい。

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

HaskellやRubyでは、この関数は zip . 実装は難しくありませんが、CoreやContribで関数が欠落していないことを確認したかったのです。

があります。 zip の名前空間がありますが、Core では に記述されています。 は Zipper の機能的なテクニックへのアクセスを提供すると説明されていますが、これは私が求めているものではなさそうです。

この方法で、2つ以上のリストを結合するための同等の機能は Core にありますか?

ない場合、その関数が不要になる慣用的なアプローチがあるからでしょうか?

どのように解決するのですか?

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

は思い通りになります。

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

Haskell は zipWith ( zipWith3 , zipWith4 ,...) 関数で、これらはすべて特定の 特に、それらが受け入れる入力リストの数は固定されている必要があります。(そのため zip , zip2 , zip3 の特殊化と見なすことができます。 zipWith ファミリーを特殊化したものとみなすことができます(タプリングの一般的な使用例)。

一方、Clojureや他のLispsは可変アリティの関数をうまくサポートしています。 map はその一つで、Haskellのように"tupling"に使用することができます。

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

Clojureで"tuple"を構築する慣用的な方法は、上に表示されているように、短いベクトルを構築することです。

(念のため、いくつかの基本的な拡張を持つHaskellは可変アリティ関数を許可していることに注意してください。しかし、それらを使用するには言語の十分な理解が必要で、vanilla Haskell 98はおそらくそれらを全くサポートしていないため、固定アリティ関数は標準ライブラリに適しています)。