SlideShare a Scribd company logo
1 of 27
Download to read offline
Clojureコレクションで探る
immutableでpersistentな世界
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])
1. 改めて関数型プログラミング(言語)とは?
2. JavaとClojureのコレクションを調べてみよう
3. Clojureコレクションの全体像
4. 局所的にミュータビリティがほしいとき
5. 独自コレクションを実装しよう
改めて関数型プログラミング(言語)とは?
定義例
関数型プログラミング(functional programming;
FP)
副作用を可能な限り避ける(局所化する)プログラ
ミングスタイル
関数型プログラミング言語(functional
programming language; FPL)
関数型プログラミングが実践しやすいように設計
されている言語
再代入不可な変数が定義可能であればFPL?
const, final, val, etc.
それを活用していればFPしていることになる?
ラムダ式があり高階関数が豊富に提供されていれば
FPL?
filter, map, reduce, etc.
それを活用していればFPしていることになる?
確かにFP/FPLに近づいている感じがする。
でも、それで満足?
私🐬が期待する実用的なFPLのイメージ:
不変で永続的なデータ構造(immutable
persistent data structures) が豊富に提供さ
れ、容易に定義可能
そうでないデータ構造は非中心的な位置付け
i.e. immutableでpersistentがデフォルト
FP もできる言語をFPLと呼びたくはない
永続的(persistent)
関数型データ構造を更新する際には、更新前と更新
後のバージョンが両方ともその後の処理で利用でき
ることを期待する
複数のバージョンをサポートするデータ構造は永続
的(persistent)
←→ 同時に1つのバージョンしか許さないデータ
構造は刹那的(ephemeral)
FPLはすべてのデータ構造が自然と永続的になると
いう興味深い性質を持つ
命令型データ構造は概して刹那的
(p. 13)
『純粋関数型データ構造』
JavaとClojureのコレクションを調べてみよう
Java
オブジェクト指向・非関数型言語
静的型付き言語
JVM言語
関数型プログラミング関連機能が充実してきた
// メソッドの定義
jshell> void hello(Object x) {
...> System.out.println("Hello, %s!".formatted(x));
...> }
| created method hello(Object)
// メソッドの呼び出し
jshell> hello("Java")
Hello, Java!
Clojure
非オブジェクト指向・関数型言語
動的型付き言語
JVM言語
オブジェクト指向を嫌い関数型を志向したLisp
;; 関数の定義
user=> (defn hello [x]
(println (str "Hello, " x "!")))
#'user/hello
;; 関数の呼び出し(適用)
user=> (hello "Clojure")
Hello, Clojure!
nil
参考: Scala
オブジェクト指向・関数型言語
静的型付き言語
JVM言語
オブジェクト指向に関数型が溶け込んだ言語
// メソッドの定義
scala> def hello(x: Any): Unit =
| println(s"Hello, $x!")
def hello(x: Any): Unit
// メソッドの呼び出し
scala> hello("Scala")
Hello, Scala!
[Java]
の実装のひとつ
immutableで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
[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
コレクション(ここでは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
[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)
Clojureコレクションの全体像
Clojureコレクションに関するインターフェース
ref. (p. 38)
Clojure Applied
参考: Scala不変コレクションのトレイト
Traversable
Iterable
Seq Set Map
IndexedSeq LinearSeq SortedSet SortedMap
BitSet
ref. 可変コレクションおよび不変コレクション|
Collections | Scala Documentation
Clojureコレクションの性能特性
ref. Clojure Performance Guarantees
Scala不変コレクション(列型)の性能特性
ref. 性能特性| Collections | Scala Documentation
Clojureのデータ構造の応用について気になったら
書籍 を読もう
Clojure Applied
Further Reading
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
Scala
Java
Scala
可変コレクションおよび不変コレクション|
Collections | Scala Documentation
性能特性| Collections | Scala Documentation
Java SE 17 & JDK 17
The Collections Framework (Java SE 17 & JDK
17)
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

More Related Content

Similar to Clojureコレクションで探るimmutableでpersistentな世界

Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good PartsKent Ohashi
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)a know
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクトアシアル株式会社
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦urasandesu
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門Katsumi Honda
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングKent Ohashi
 
Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programmingtodorokit
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてkimukou_26 Kimukou
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)tnoda
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateTakashi Aoe
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 

Similar to Clojureコレクションで探るimmutableでpersistentな世界 (20)

Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good Parts
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
 
Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programming
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX Update
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 

More from Kent Ohashi

インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPCインターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPCKent Ohashi
 
Team Geek Revisited
Team Geek RevisitedTeam Geek Revisited
Team Geek RevisitedKent Ohashi
 
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt TechnologiesScala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt TechnologiesKent Ohashi
 
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)Kent Ohashi
 
実用のための語源学入門
実用のための語源学入門実用のための語源学入門
実用のための語源学入門Kent Ohashi
 
メタプログラミング入門
メタプログラミング入門メタプログラミング入門
メタプログラミング入門Kent Ohashi
 
労働法の世界
労働法の世界労働法の世界
労働法の世界Kent Ohashi
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSLKent Ohashi
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門Kent Ohashi
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
たのしい多言語学習
たのしい多言語学習たのしい多言語学習
たのしい多言語学習Kent Ohashi
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門Kent Ohashi
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made EasyKent Ohashi
 
Clojurian Conquest
Clojurian ConquestClojurian Conquest
Clojurian ConquestKent Ohashi
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixirKent Ohashi
 
GraphQL API in Clojure
GraphQL API in ClojureGraphQL API in Clojure
GraphQL API in ClojureKent Ohashi
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalKent Ohashi
 
Boost your productivity with Clojure REPL
Boost your productivity with Clojure REPLBoost your productivity with Clojure REPL
Boost your productivity with Clojure REPLKent Ohashi
 
ClojureScript: The Good Parts
ClojureScript: The Good PartsClojureScript: The Good Parts
ClojureScript: The Good PartsKent Ohashi
 

More from Kent Ohashi (20)

インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPCインターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
 
Team Geek Revisited
Team Geek RevisitedTeam Geek Revisited
Team Geek Revisited
 
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt TechnologiesScala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
 
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
 
実用のための語源学入門
実用のための語源学入門実用のための語源学入門
実用のための語源学入門
 
メタプログラミング入門
メタプログラミング入門メタプログラミング入門
メタプログラミング入門
 
労働法の世界
労働法の世界労働法の世界
労働法の世界
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
たのしい多言語学習
たのしい多言語学習たのしい多言語学習
たのしい多言語学習
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
 
Clojurian Conquest
Clojurian ConquestClojurian Conquest
Clojurian Conquest
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
 
GraphQL API in Clojure
GraphQL API in ClojureGraphQL API in Clojure
GraphQL API in Clojure
 
法学入門
法学入門法学入門
法学入門
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
 
Boost your productivity with Clojure REPL
Boost your productivity with Clojure REPLBoost your productivity with Clojure REPL
Boost your productivity with Clojure REPL
 
ClojureScript: The Good Parts
ClojureScript: The Good PartsClojureScript: The Good Parts
ClojureScript: The Good Parts
 

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