Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Kent Ohashi
34 views
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
Kotlin標準コレクションのイミュータビリティ(不変性)について、ScalaやClojureと比較しながら調べてみよう!
Software
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 22
2
/ 22
3
/ 22
4
/ 22
5
/ 22
6
/ 22
7
/ 22
8
/ 22
9
/ 22
10
/ 22
11
/ 22
12
/ 22
13
/ 22
14
/ 22
15
/ 22
16
/ 22
17
/ 22
18
/ 22
19
/ 22
20
/ 22
21
/ 22
22
/ 22
More Related Content
PDF
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
by
Kent Ohashi
PDF
Clojureコレクションで探るimmutableでpersistentな世界
by
Kent Ohashi
PDF
fanscala1 2 scalaの基本
by
Toshiki Shinozaki
PDF
プログラミング言語Scala
by
TanUkkii
PDF
From Scala/Clojure to Kotlin
by
Kent Ohashi
PDF
Collectionを使いこなす
by
Recruit Lifestyle Co., Ltd.
PDF
Programming in Scala Chapter 17 Collections
by
Joongjin Bae
PPTX
scala.collection 再入門 (改)
by
Ryuichi ITO
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
by
Kent Ohashi
Clojureコレクションで探るimmutableでpersistentな世界
by
Kent Ohashi
fanscala1 2 scalaの基本
by
Toshiki Shinozaki
プログラミング言語Scala
by
TanUkkii
From Scala/Clojure to Kotlin
by
Kent Ohashi
Collectionを使いこなす
by
Recruit Lifestyle Co., Ltd.
Programming in Scala Chapter 17 Collections
by
Joongjin Bae
scala.collection 再入門 (改)
by
Ryuichi ITO
Similar to ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
PDF
速習Collections
by
irof N
PDF
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
by
Kent Ohashi
PDF
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
by
Kent Ohashi
PPTX
ゼロから始めるScala文法 (再)
by
Suguru Hamazaki
PDF
kollectionの紹介
by
Kota Mizushima
PDF
Scala超入門 - 2014/12/13 Scala関西勉強会
by
Asami Abe
PDF
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
ODP
Vim scriptとJavaとHaskell
by
aiya000
PDF
Scalaを触ってみた
by
Nemoto Yusuke
PDF
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
by
NTT DATA Technology & Innovation
PDF
Scala勉強会_2014_11_18
by
Shuya Tsukamoto
PDF
Kotlin勉強会 in ehime
by
Eigoro Yamamura
PDF
Scalaプログラミング・マニアックス
by
Tomoharu ASAMI
KEY
Beginners Scala in FAN 20121009
by
Taisuke Shiratori
PDF
15分でざっくり分かるScala入門
by
SatoYu1ro
PDF
LastaFluteでKotlinをはじめよう
by
Shinsuke Sugaya
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
by
Kent Ohashi
速習Collections
by
irof N
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
by
Kent Ohashi
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
by
Kent Ohashi
ゼロから始めるScala文法 (再)
by
Suguru Hamazaki
kollectionの紹介
by
Kota Mizushima
Scala超入門 - 2014/12/13 Scala関西勉強会
by
Asami Abe
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
Vim scriptとJavaとHaskell
by
aiya000
Scalaを触ってみた
by
Nemoto Yusuke
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
by
NTT DATA Technology & Innovation
Scala勉強会_2014_11_18
by
Shuya Tsukamoto
Kotlin勉強会 in ehime
by
Eigoro Yamamura
Scalaプログラミング・マニアックス
by
Tomoharu ASAMI
Beginners Scala in FAN 20121009
by
Taisuke Shiratori
15分でざっくり分かるScala入門
by
SatoYu1ro
LastaFluteでKotlinをはじめよう
by
Shinsuke Sugaya
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
by
Kent Ohashi
More from Kent Ohashi
PDF
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
by
Kent Ohashi
PDF
TDD with RDD: Clojure/LispのREPLで変わる開発体験
by
Kent Ohashi
PDF
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
by
Kent Ohashi
PDF
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
by
Kent Ohashi
PDF
RDBでのツリー表現入門2024
by
Kent Ohashi
PDF
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
by
Kent Ohashi
PDF
Team Geek Revisited
by
Kent Ohashi
PDF
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
by
Kent Ohashi
PDF
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
by
Kent Ohashi
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
by
Kent Ohashi
PDF
実用のための語源学入門
by
Kent Ohashi
PDF
メタプログラミング入門
by
Kent Ohashi
PDF
労働法の世界
by
Kent Ohashi
PDF
Clojureで作る"simple"なDSL
by
Kent Ohashi
PDF
RDBでのツリー表現入門
by
Kent Ohashi
PDF
GraphQL入門
by
Kent Ohashi
PDF
Everyday Life with clojure.spec
by
Kent Ohashi
PDF
たのしい多言語学習
by
Kent Ohashi
PDF
Ductモジュール入門
by
Kent Ohashi
PDF
Clojure REPL: The Good Parts
by
Kent Ohashi
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
by
Kent Ohashi
TDD with RDD: Clojure/LispのREPLで変わる開発体験
by
Kent Ohashi
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
by
Kent Ohashi
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
by
Kent Ohashi
RDBでのツリー表現入門2024
by
Kent Ohashi
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
by
Kent Ohashi
Team Geek Revisited
by
Kent Ohashi
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
by
Kent Ohashi
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
by
Kent Ohashi
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
by
Kent Ohashi
実用のための語源学入門
by
Kent Ohashi
メタプログラミング入門
by
Kent Ohashi
労働法の世界
by
Kent Ohashi
Clojureで作る"simple"なDSL
by
Kent Ohashi
RDBでのツリー表現入門
by
Kent Ohashi
GraphQL入門
by
Kent Ohashi
Everyday Life with clojure.spec
by
Kent Ohashi
たのしい多言語学習
by
Kent Ohashi
Ductモジュール入門
by
Kent Ohashi
Clojure REPL: The Good Parts
by
Kent Ohashi
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
1.
ミュータビリティと イミュータビリティの狭間 関数型言語使いから見たKotlinコレクション #kotlinfest2024_after_33 1
2.
のプロダクトエンジニア 主要技術スタック: Kotlin + のたまごスポンサー🥚 の運営企業 関数型言語/関数型プログラミングが好き 仕事や趣味で
, , などに長く 触れてきた 最近再入門したKotlinも好きになりつつある😆 lagénorhynque🐬カマイルカ 株式会社スマートラウンド Ktor Kotlin Fest 2024 Server-Side Kotlin Meetup Clojure Scala Haskell 2
3.
1. きっかけ 2. 実験・調査 3.
まとめ 3
4.
1. きっかけ 4
5.
Kotlin Fest 2024のセッションを聴いていた私🐬 「Kotlinにはイミュータブルとミュータブルの2種 類のコレクションがあります」 「Kotlinを導入することで私たちはイミュータビリ ティを得ました」 Kotlinの
List のコードとともに破壊的更新操作 ができない例が示される 5
6.
🐬の反応 Kotlinの List, Set,
Map などは「イミュータブル」 (不変)なコレクションといえるのだろうか🤔 同じくJVM言語(さらに関数型言語)のScalaや Clojureとはどう違うのだろう 確かKotlinには準標準ライブラリ(?)として があったはず🤔 immutable/persistent collectionsを別途用意し ているということは標準のコレクションはそうで はないと暗示しているような? kotlinx.collections.immutable 6
7.
2. 実験・調査 7
8.
Lisper/Clojurianの本能に従ってREPLで試してみる ℹ️実行環境 # Kotlin $ kotlinc
-version info: kotlinc-jvm 2.0.0 (JRE 22.0.1) # Scala $ scala -version Scala code runner version 3.4.2 -- Copyright 2002-2024, LAMP/ EPFL # Clojure $ clj -version Clojure CLI version 1.11.3.1463 8
9.
Kotlinの List MutableList インスタンスを
List 変数に代入する: >>> val xs: MutableList<Int> = mutableListOf(1, 2, 3) // イミュータブル(?)とされるList型の変数に代入できてしまった >>> val ys: List<Int> = xs >>> ys.add(4) error: unresolved reference: add ys.add(4) ^ >>> xs.add(4) res3: kotlin.Boolean = true >>> xs res4: kotlin.collections.MutableList<kotlin.Int> = [1, 2, 3, 4] // MutableList型の変数xsからの破壊的更新がysに必然的に波及している >>> ys res5: kotlin.collections.List<kotlin.Int> = [1, 2, 3, 4] 9
10.
インターフェース kotlin.collections.MutableList は kotlin.collections.List を継承している ref. 実体は
(Javaのミュータ ブルな可変長リスト) >>> xs::class res6: kotlin.reflect.KClass<out kotlin.collections.MutableLi st<kotlin.Int>> = class java.util.ArrayList >>> ys::class res7: kotlin.reflect.KClass<out kotlin.collections.List<kotl in.Int>> = class java.util.ArrayList MutableList - Kotlin Programming Language java.util.ArrayList 10
11.
List インスタンスをJavaのメソッドで操作する: >>> val
zs: List<Int> = listOf(1, 3, 2) // Javaの破壊的なメソッドがコンパイル/実行時エラーなく呼び出せてしまった >>> java.util.Collections.sort(zs, { a, b -> b.compareTo(a) } ) // イミュータブル(?)とされるListのインスタンスが更新できてしまった >>> zs res10: kotlin.collections.List<kotlin.Int> = [3, 2, 1] 11
12.
listOf に2要素以上を与えて得られる実体は の戻り値と同じ(ミ ュータブルな固定長リスト) >>> listOf<Int>()::class res11:
kotlin.reflect.KClass<out kotlin.collections.List<kotl in.Int>> = class kotlin.collections.EmptyList >>> listOf(1)::class res12: kotlin.reflect.KClass<out kotlin.collections.List<kotl in.Int>> = class java.util.Collections$SingletonList >>> listOf(1, 2)::class res13: kotlin.reflect.KClass<out kotlin.collections.List<kotl in.Int>> = class java.util.Arrays$ArrayList >>> listOf(1, 2, 3)::class res14: kotlin.reflect.KClass<out kotlin.collections.List<kotl in.Int>> = class java.util.Arrays$ArrayList java.util.Arrays.asList 12
13.
参考: Scalaの List ListBuffer
インスタンスを List 変数に代入する: が明確に分離されている scala> val xs: List[Int] = List(1, 2, 3) val xs: List[Int] = List(1, 2, 3) // Listは独自のイミュータブルコレクション scala> xs.getClass val res0: Class[? <: List[Int]] = class scala.collection.immu table.$colon$colon // ミュータブルなListBufferとイミュータブルなListにまったく互換性なし scala> val ys: scala.collection.mutable.ListBuffer[Int] = xs -- [E007] Type Mismatch Error: ------------------------------ // (エラー詳細は省略) ミュータブルコレクションとイミュータブルコレク ションの型階層 13
14.
List インスタンスをJavaのメソッドで操作する: が、破壊的更新はできない (できたらイミュータブルコレクションと呼べない) scala> val
zs: List[Int] = List(1, 3, 2) val zs: List[Int] = List(1, 3, 2) // ScalaのListはJavaのCollection/Listと互換性がない scala> java.util.Collections.sort(zs, Ordering[Int].reverse) -- [E007] Type Mismatch Error: ------------------------------ // (エラー詳細は省略) // 内部的な実体を維持しながら(コピーせず) Javaコレクションに変換できる scala> import scala.jdk.CollectionConverters.* scala> val zs_ = zs.asJava val zs_: java.util.List[Int] = [1, 3, 2] // 破壊的更新操作はサポートしていない(実行時エラーになる) scala> java.util.Collections.sort(zs_, Ordering[Int].reverse) java.lang.UnsupportedOperationException 実体を維持したままJavaのインターフェースに適合 するように変換できる 14
15.
参考: Clojureのvector (IPersistentVector) 標準ライブラリに user=>
(def xs [1 2 3]) #'user/xs ;; vectorは独自のイミュータブルコレクション user=> (class xs) clojure.lang.PersistentVector ;; IPersistentVectorインターフェースを実装している user=> (instance? clojure.lang.IPersistentVector xs) true ;; Java interopを円滑にするため、java.util.Listも実装している user=> (instance? java.util.List xs) true 独自のミュータブルコレクション はない 15
16.
vectorインスタンスをJavaのメソッドで操作する: Javaのインターフェースを実装しているが、破壊的 更新はできない(できたらイミュータブルコレクシ ョンと呼べない) user=> (def zs
[1 3 2]) #'user/zs ;; 破壊的更新操作はサポートしていない(実行時エラーになる) user=> (java.util.Collections/sort zs >) Execution error (UnsupportedOperationException) at java.util. List/sort (List.java:514). 16
17.
3. まとめ 17
18.
イミュータブル(不変)っぽく見えてイミュータブル とは言いがたいデータ構造がある Kotlinの List はその例だといえる immutableではなく
read-only (読み取り専用) なインターフェースと呼ぶのが正確と思われる ref. effectively immutable (実質的にイミュータブル) だと形容されることもあるが、抜け道が残れば当 然ながらイミュータビリティ(不変性)は保証され ないことになる List - Kotlin Programming Language 18
19.
🐬の感想: Kotlin言語/標準ライブラリの設計判断には実用 上の合理性を感じる ある意味でScala/Clojure以上にJava interopを 重視するからこそ必然性があるのかも(?) しかし、純粋な関数とデータで副作用を最小化/ 局所化するプログラミングスタイル(関数型プロ グラミング)を好む私としては、イミュータブル コレクションがデフォルトであってほしかった (Kotlinでの総合的な開発体験は好印象😊) 19
20.
Further Reading KotlinのListについて : REPLでの簡単な実験結果のメモ
by 🐬 read-only vs immutable lists in Kotlin, Scala and Clojure Kotlinのコレクションは「不変」と「可変」に分か れていない - kmizuの日記 Kotlin 紹介 - List / MutableList - PHONE APPLI Engineer blog 20
21.
Kotlin, Scala, Clojureのコレクションについて Collections
overview | Kotlin Documentation Calling Java from Kotlin | Kotlin Documentation > Mapped types Mutable and Immutable Collections | Collections | Scala Documentation Conversions Between Java and Scala Collections | Collections | Scala Documentation Clojure - Data Structures > Collections 21
22.
関数型プログラミングについて : 関数型プログラミ ングの考え方と実利の紹介 by
🐬 : 不変かつ永続的なコ レクションの簡単な紹介 by 🐬 JavaからScala、そしてClojureへ: 実務で活きる関 数型プログラミング | ドクセル Clojureコレクションで探るimmutableで persistentな世界 | ドクセル Immutable object - Wikipedia Persistent data structure - Wikipedia 22
Download