📝Clojure Collections and Sequences
Clojureのシーケンスや高階関数を巧みに扱うことができるとモテるとか. こういうのは知っているか知らないかなのでイディオムを覚えてモテよう.
Clojure: Collections #
ClojureのCollectionはimmutableでpersistent.
Clojure Collection操作 #
よく使うものを列挙.
- conj: コレクションの結合. 他の言語ではpush, concat, appendとか.
Clojure Sequences(clojure.core.sequence) #
refs: Clojure - Clojureを学ぼう - シーケンシャルなコレクション
シーケンス型 には4種類の重要なデータ構造がある.
- list: ()
- vector: []
- map: {}
- set: #{}
Clojure: into #
into は第一引数のコレクションに, 第二引数のシーケンスの要素全てを, 元のコレクションにとって自然な形で追加 (conj) してくれる関数.
(into %1 %2) は,
(reduce conj %1 %2) つまり %1 に %2 の要素を順に conj したものと同等.
(conj (conj %1 %2の最初の要素) %2の二番目の要素)と同等.
Clojure Map(clojure.core.map) #
- assoc: (key, value)の追加
- dissoc: (key, value)の削除
- update: (key)の指す(value)に引数で与えられた関数を適用して置き換える.
- merge: (key, value)の集合の追加
assocは値を更新してMapを返す, updateは値に関数を適用してMapに束縛する. この関係は, atomでのreset! とswap!の違い に似ている.
mapは遅延シーケンスを構築するため, doall などの評価は別途必要.
しかしdoallを一連のmap/filter/reduce中に挟むと処理速度が落ちるため必要なときのみ利用する. または逐次処理であるdoseqを検討する.
途中で中身が必要というのはそもそもmapを命令形のfor文のノリで使っている可能性が高い.
ClojureにおけるSequenceとCollectionの違い #
ClojureではCollectionとSequenceは異なる概念.
- collection: データ構造の抽象.
- sequence: collectionの中でデータを順次アクセス可能(シーカブル)なもの.
SequenceはCollectionの特殊な形態であり、Collectionを表現する方法の1つ.
実装レベルでは coll?で真が変えればcollection, seq?で真が変えればsequence.
collectionはIPersistentCollectionというインタフェースを実装しているもの. IPersistentCollectionは5つのメソッド(count, cons, empty, equiv, seq)からなる.
sequenceはISeqというインタフェースを実装しているもの. ISeqは(first, next, more, cons)からなる.
- ref: Clojureにおけるデータ構造の抽象化を理解して独自のデータ構造を実装する
💡Clojureデータ構造の操作関数の分類 #
Clojureの関数は大きく分けて2つの種類に分けられる.
- データ構造の操作の関数(conj, disj, assoc, dissoc…)
- シーケンス操作の関数(cons, map, filter, reduce..)
データ構造を操作する関数は関数の次にデータ構造を受ける. 一方シーケンス操作は関数評価式の最後にデータ構造を受ける.
Clojure: Threading Macros にも 2種類あるのもこれが関係している.
ref: Clojure - Frequently Asked Questions
Associative vs Sequencialという概念の対立 #
T.B.D.
✅Active Recalls #
ClojureのCollectionとSequenceの違いはなんですか? #
Collectionはデータ集合. SequenceはCollectionに順次アクセスの操作がついたもの.
Clojure のlist, vector, map, setのシンタックスはなんですか? #
それぞれ,(), [], {}, #{}
Clojureのmapにデータを追加と削除をする関数はなんですか? #
assocとdissoc
✅ anki: assoc, update の違いはなんですか? #
assoc は key に対して新しい val をマッピングしたMapを返す.
update は古いvalに対して関数を適用し得た新しいvalをマッピングしたMapを返す.