[解決済み] Clojure: cons (seq) vs. conj (list)
質問
私は、以下のことを知っています。
cons
はseqを返し
conj
はコレクションを返す。 また、私は
conj
はコレクションの最適な末尾にアイテムを追加します。
cons
は常にアイテムを最前面に追加します。 この例では、これらのポイントの両方を説明しています。
user=> (conj [1 2 3] 4) ; returns a collection
[1 2 3 4]
user=> (cons 4 [1 2 3]) ; returns a seq
(4 1 2 3)
ベクトル、マップ、セットについては、これらの違いは私には意味があります。 しかし、リストについては、それらは同じように見えます。
user=> (conj (list 3 2 1) 4) ; returns a list
(4 3 2 1)
user=> (cons 4 (list 3 2 1)) ; returns a seq
(4 3 2 1)
リストを使った例で
conj
vs.
cons
は異なる挙動を示すのでしょうか、それとも本当に互換性があるのでしょうか? 別の言い方をすれば、リストとseqが等価に使用できない例はあるのでしょうか?
どのように解決するのですか?
ひとつ違うのは
conj
はコレクションに挿入する引数をいくつでも受け付けるのに対し
cons
は1つだけ取ります。
(conj '(1 2 3) 4 5 6)
; => (6 5 4 1 2 3)
(cons 4 5 6 '(1 2 3))
; => IllegalArgumentException due to wrong arity
もう一つの違いは、戻り値のクラスです。
(class (conj '(1 2 3) 4))
; => clojure.lang.PersistentList
(class (cons 4 '(1 2 3))
; => clojure.lang.Cons
これらは実際には互換性がないことに注意してください。特に
clojure.lang.Cons
は
clojure.lang.Counted
を実装していないので
count
はもはや定数時間操作ではありません (この場合、おそらく 1 + 3 になるでしょう -- 1 は最初の要素に対する線形探索から、3 は
(next (cons 4 '(1 2 3))
が
PersistentList
であるため
Counted
).
この名称の背後にある意図は、私は次のように考えています。
cons
は、cons(truct a seq)を意味します。
1
であるのに対し
conj
はコレクションに項目を結合することを意味する。そのため
seq
によって構成される
cons
は、第1引数として渡された要素から始まり、その要素には
next
/
rest
を適用した結果生じたものを分ける。
seq
を第二引数に適用した結果生じるものです。上に表示されているように、全体はクラス
clojure.lang.Cons
. これに対して
conj
は常に渡されたコレクションとほぼ同じ型のコレクションを返します。(大まかな理由は
PersistentArrayMap
は
PersistentHashMap
に変わります)。
1
従来、Lispの世界では
cons
はペアを構成するので、ClojureはLispの伝統から離れ、その
cons
を持たないseqを構築するという点で、ClojureはLispの伝統から外れています。
cdr
. の一般的な使い方は
cons
を使用して、いくつかの値をまとめて保持するために何らかの型のレコードを構築することを意味する、プログラミング言語とその実装の研究では現在いたるところで使用されています。
関連
-
[解決済み] vbscriptでコレクションオブジェクトを作成する方法は?
-
[解決済み] ScalaのSeqとListの違いについて
-
[解決済み] Javaで新しいListを作成する方法
-
[解決済み] JavaでMapをListに変換する方法は?
-
[解決済み] Java 8でリストのリストをリストにするにはどうしたらいいですか?
-
[解決済み] Javaでリストを集合に変換する最も簡単な方法
-
[解決済み] Javaでリストを反復処理する方法
-
[解決済み】KotlinのListに "add"、"remove "がない、Mapに "put "がないなど?
-
[解決済み] コレクション内のカウントと長さ、サイズ
-
[解決済み] エンティティのコレクションにおけるIListとIEnumerableの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] vbscriptでコレクションオブジェクトを作成する方法は?
-
[解決済み] MongoDBで複数のコレクションを一度にクエリする
-
[解決済み] List<> and/or Map<> クラス/ライブラリのタイプスクリプトはありますか?[クローズド]
-
[解決済み】KotlinのListに "add"、"remove "がない、Mapに "put "がないなど?
-
[解決済み】Javaで最後のN個の要素を保持するサイズ制限のある待ち行列
-
[解決済み] コレクション内のカウントと長さ、サイズ
-
[解決済み] エンティティのコレクションにおけるIListとIEnumerableの比較
-
[解決済み] Dartでリスト、マップ、セットのクローンを作成する