$30 off During Our Annual Pro Sale. View Details »

Exploring Immutable Persistent World with Clojure Collections

Kent OHASHI
September 30, 2022

Exploring Immutable Persistent World with Clojure Collections

Clojureコレクションで探るimmutableでpersistentな世界
関数型言語Clojureを通して不変で永続的なコレクションに触れてみよう!

Kent OHASHI

September 30, 2022
Tweet

More Decks by Kent OHASHI

Other Decks in Programming

Transcript

  1. Clojure コレクションで探る immutable で persistent な世界

  2. lagénorhynque 🐬 カマイルカ (defprofile lagénorhynque :id @lagenorhynque :readings ["/laʒenɔʁɛ̃ k/"

    "ラジェノランク"] :aliases ["カマイルカ" " 🐬 "] :languages [Java Japanese ; native languages Clojure Haskell ; functional languages English français] ; European languages :interests [programming language-learning law politics mathematics])
  3. 1. 改めて関数型プログラミング( 言語) とは? 2. Java とClojure のコレクションを調べてみよう 3. Clojure

    コレクションの全体像 4. 局所的にミュータビリティがほしいとき 5. 独自コレクションを実装しよう
  4. 改めて関数型プログラミング ( 言語 ) とは ?

  5. 定義例 関数型プログラミング(functional programming; FP) 副作用を可能な限り避ける( 局所化する) プログラ ミングスタイル 関数型プログラミング言語(functional programming

    language; FPL) 関数型プログラミングが実践しやすいように設計 されている言語
  6. 再代入不可な変数が定義可能であればFPL? const, final, val, etc. それを活用していればFP していることになる? ラムダ式があり高階関数が豊富に提供されていれば FPL? filter,

    map, reduce, etc. それを活用していればFP していることになる?
  7. 確かにFP/FPL に近づいている感じがする。 でも、それで満足?

  8. 私🐬が期待する実用的なFPL のイメージ: 不変で永続的なデータ構造(immutable persistent data structures) が豊富に提供さ れ、容易に定義可能 そうでないデータ構造は非中心的な位置付け i.e.

    immutable でpersistent がデフォルト FP も できる言語をFPL と呼びたくはない
  9. 永続的 (persistent) 関数型データ構造を更新する際には、更新前と更新 後のバージョンが両方ともその後の処理で利用でき ることを期待する 複数のバージョンをサポートするデータ構造は永続 的(persistent) ←→ 同時に1 つのバージョンしか許さないデータ

    構造は刹那的(ephemeral) FPL はすべてのデータ構造が自然と永続的になると いう興味深い性質を持つ 命令型データ構造は概して刹那的 (p. 13) 『純粋関数型データ構造』
  10. Java と Clojure のコレクションを調べてみよう

  11. Java オブジェクト指向・非関数型言語 静的型付き言語 JVM 言語 関数型プログラミング関連機能が充実してきた // メソッドの定義 jshell> void

    hello(Object x) { ...> System.out.println("Hello, %s!".formatted(x)); ...> } | created method hello(Object) // メソッドの呼び出し jshell> hello("Java") Hello, Java!
  12. Clojure 非オブジェクト指向・関数型言語 動的型付き言語 JVM 言語 オブジェクト指向を嫌い関数型を志向したLisp ;; 関数の定義 user=> (defn

    hello [x] (println (str "Hello, " x "!"))) #'user/hello ;; 関数の呼び出し(適用) user=> (hello "Clojure") Hello, Clojure! nil
  13. 参考 : Scala オブジェクト指向・関数型言語 静的型付き言語 JVM 言語 オブジェクト指向に関数型が溶け込んだ言語 // メソッドの定義

    scala> def hello(x: Any): Unit = | println(s"Hello, $x!") def hello(x: Any): Unit // メソッドの呼び出し scala> hello("Scala") Hello, Scala!
  14. [Java] の実装のひとつ mutable でephemeral な可変長配列 java.util.ArrayList user=> (def xs (java.util.ArrayList.))

    #'user/xs user=> xs [] user=> (def ys ; ysに束縛 #_=> (doto xs #_=> (.add 1) ; 破壊的に要素追加 #_=> (.add 2) #_=> (.add 3))) #'user/ys user=> ys [1 2 3] user=> (identical? xs ys) ; オブジェクトの同一性を確認 true java.util.List
  15. [Java] unmodifiable (view) list user=> (def xs #_=> (doto (java.util.ArrayList.)

    #_=> (.add 1) #_=> (.add 2) #_=> (.add 3))) #'user/xs user=> xs [1 2 3] user=> (def ys (java.util.Collections/unmodifiableList xs)) ; 変 #'user/ys user=> (.add ys 4) ; 破壊的更新操作はできない Execution error (UnsupportedOperationException) at java.util.Col modifiableCollection/add (Collections.java:1067). null
  16. コレクション( ここではList) に対する変更不可能な ビュー もとのコレクションやその要素がmutable なら immutable ではない もとのコレクションが( 実質的に)

    immutable であ る、もしくはこのビューを介してのみ操作できる 状態であれば実質的にimmutable cf. user=> (.add xs 4) ; もとのリストは破壊的更新操作ができる true user=> xs [1 2 3 4] user=> ys ; 変更不可能なビューにも波及する [1 2 3 4] java.util.Collection
  17. [Clojure] の実装 immutable でpersistent な可変長配列 の一種 ベクター (vector) user=> (def

    xs []) ; 初期化 #'user/xs user=> xs [] user=> (def ys (conj xs 1 2 3)) ; 要素追加してysに束縛(破壊的更新操作 #'user/ys user=> ys [1 2 3] user=> (identical? xs ys) ; オブジェクトの同一性を確認 false clojure.lang.IPersistentVector HAMT (hash array mapped trie)
  18. Clojure コレクションの全体像

  19. Clojure コレクションに関するインターフェース ref. (p. 38) Clojure Applied

  20. 参考 : Scala 不変コレクションのトレイト Traversable Iterable Seq Set Map IndexedSeq

    LinearSeq SortedSet SortedMap BitSet ref. 可変コレクションおよび不変コレクション | Collections | Scala Documentation
  21. Clojure コレクションの性能特性 ref. Clojure Performance Guarantees

  22. Scala 不変コレクション ( 列型 ) の性能特性 ref. 性能特性 | Collections

    | Scala Documentation
  23. Clojure のデータ構造の応用について気になったら 書籍 を読もう Clojure Applied

  24. Further Reading

  25. Clojure Clojure Clojure - Data Structures Clojure - Sequences Clojure

    - Transient Data Structures Clojure - Datatypes: deftype, defrecord and reify Clojure Applied: From Practice to Practitioner Clojure Performance Guarantees [Stefan Tilkov’s Blog] clojure/core.rrb-vector: RRB-Trees in Clojure
  26. Scala Java Scala 可変コレクションおよび不変コレクション | Collections | Scala Documentation 性能特性

    | Collections | Scala Documentation Java SE 17 & JDK 17 The Collections Framework (Java SE 17 & JDK 17)
  27. Kotlin JavaScript Python Kotlin/kotlinx.collections.immutable: Immutable persistent collections for Kotlin immutable-js/immutable-js:

    Immutable persistent data collections for Javascript which increase efficiency and simplicity. tobgu/pyrsistent: Persistent/Immutable/Functional data structures for Python