SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
kollectionの紹介
第3回Kotlin勉強会@Sansan
Kota Mizushima
構文解析友の会
プログラミング言語友の会
自己紹介
Twitter:
GitHub:
構文解析おじさん& プログラミング言語オタク
Scalaエヴァンジェリスト
趣味:プログラミング言語|形式言語の自作
, etc.
@kmizu
kmizu
Onion
Klassic
Macro PEG
kotlin.collections
Kotlinのコレクションライブラリ
大部分は のラッパ
実体としては同じだが型だけ違う
可変コレクション
MutableList, MutableMap, MutableSet, etc.
読み取り専用ビュー
List, Map, Set, etc.
「不変」コレクションではない点に注意
不変VS. 読み取り専用
不変の場合、ある変数が指すオブジェクトは絶対に変
わらない
読み取り専用の場合、特定の変数経由でオブジェクト
が変更できないことしか保証しない
Kotlin標準ライブラリ(stdlib)は不変コレクションを提
供しない
読み取り専用ビューのみ
>>> val m = arrayListOf(1, 2, 3)
>>> m
[1, 2, 3]
>>> val n: List<Int> = m
>>> n
[1, 2, 3]
>>> m.add(4)
true
>>> n
[1, 2, 3, 4] //中身 書 換
不変コレクションの利点
安心して引数として渡したり返り値にできる
異なるスレッド間で安全に共有できる
引数として受け取ったコレクションをフィールドに
安全に代入できる
読み取り専用ビューはどちらも提供しない
Kotlinにも不変コレクションライブラリが欲しい!
kollection
Kotlin用不変コレクションライブラリ
latest: 0.3
今日リリースした
https://github.com/kmizu/kollection
dependencies {
compile "com.github.kmizu:kollection:0.3"
}
kollectionが提供するコレクション
(0.3)
KList: 不変リスト
KStream: 不変遅延リスト
KOption: Optional
KStack: 不変スタック
KListSet: KListによるSet実装
KListMap: KListによるMap実装
KLazy: 遅延初期化セル
KList
コンスセルベースの不変リスト
val a = 1 cons (2 cons (3 cons (4 cons (5 cons Nil))))
val b = KList(1, 2, 3, 4, 5)
a == b
val a = KList(KList(1, 2), KList(3, 4), KList(5, 6))
val result = a.sum(KMonoid.KLIST())
result == KList(1, 2, 3, 4, 5, 6)
val a = Klist(1, 2, 3, 4, 5) zip KList(1, 2, 3, 4, 5)
a == KList(1 to 1, 2 to 2, 3 to 3, 4 to 4, 5 to 5)
KStream
コンスセルベースの遅延リスト
fun ones(): KStream<Int> = 1 cons { ones() }
println(ones().take(5)) // KStream(1, 1, 1, 1, 1)
fun fib(): KStream<Int> = 0 cons { 1 cons { fib() zip fib().tl map {it.first
println(fib().take(7)) // KStream(0, 1, 1, 2, 3, 5, 8)
val nat = KStream.from(0)
println(nat.take(5)) // KStream(0, 1, 2, 3, 4)
KOption
nullable-typeと似たようなもの
みたいな値を取り得る
val x: KOption<String> = Some("FOO")
x.filter{it == "BAR"} == None
val x: KOption<String> = Some("FOO")
x.map{it + it} == Some("FOOFOO")
val x: KOption<String> = None
x getOrElse { "BAR" } == "BAR"
KEither
失敗した場合の情報を保持するように を拡張
したもの
通常、 で成功時の情報を、 で失敗時の情
報を保持する
いわゆるEither
val x: KEither<Int, Int> = Left<Int, Int>(1)
x.map{it * 2} == Left<Int, Int>(1) // Left 場合 map 適用
val x: KEither<Int, Int> = Right<Int, Int>(1)
x.map{it * 2} == Right<Int, Int>(2) // Right 場合 map 適用
KBatchedQueue
不変キュー(FIFO)
償却計算量(O(n))
val q = KBatchedQueue(1, 2, 3, 4, 5)
val result = q enqueue 6
KBatchedQueue(1, 2, 3, 4, 5, 6).toList() == result.toList()
val q = KBatchedQueue(1, 2, 3, 4, 5)
val result = q enqueue 6
val result = q.dequeue()
KBatchedQueue(2, 3, 4, 5).toList() == result.toList()
KStack
不変スタック(内部的には を利用)
val kstack = KStack(1, 2, 3, 4, 5)
kstack == KStack<Int>().push(1).push(2).push(3).push(4).push(5)
kstack.top == 5
kstack.pop() == KStack(1, 2, 3, 4)
KListSet
不変集合
ベースなので遅いが、 さえ定義されて
いれば何にでも使える
val set = KListSet(1, 2, 3, 4, 5)
set[0] == false
set[1] == true
set[6] == false
val set2 = set + 6
set[0] == false
set[1] == true
set[6] == true
val set3 = set2 - 1
set[0] == false
set[1] == false
set[6] == true
KListMap
不変マップ
同じく ベースなので遅いが、 さえ定義
されていれば良い
を使ってキーが存在したかを返す
val map = KListMap(1 to 2, 3 to 4, 5 to 6)
map[1] == Some(2)
map[3] == Some(4)
map[5] == Some(6)
map[6] == None
val map2 = map + (6 to 8)
map2[6] == Some(8)
今後の予定
KTreeMap, KTreeSet
赤黒木ベース
KHashMap, KHashSet
ハッシュトライベース?
KRealtimeQueue
各操作が必ず定数時間で終わるようにする
Scalaistから見たKotlin(1) - 良いと
ころ
基本文法はだいたいScalaから借りてきてる
Scalaistからみてわかりやすい
data class ≒case class
sealed class
val/var name: type
primary constructor
(Scalaに比べて)コンパイルが速い
でも遅い
もっとコンパイルが速くなることを期待
Scalaistから見たKotlin(2) - 良くな
いところ
sealed classを継承してdata classを作れない
Kotlin 1.1では改善されるらしい
パターンマッチがない
ADTが気軽に作れない
Scalaから引き継いだ謎のFunction22制限
問題になることはほとんどない
ツールが未成熟
dokka
spek
まとめ
Kotlinには不変コレクションがない
不変コレクションライブラリを作ってみた
KList, KStream, KOption, KStack, etc.
まだまだ工事中
予定:KRealtimeQueue, KHashSet, KTreeSet,
KHashMap, KTreeMap
おまけ- dokkaが生成したAPIリフ
ァレンス
とても見づらい(一応JetBrains公式)
dokkaを使っている人がさっぱり見当たらない
dokkaの改善に貢献しよう!

Contenu connexe

Tendances

Haskell超初心者勉強会20
Haskell超初心者勉強会20Haskell超初心者勉強会20
Haskell超初心者勉強会20
Takashi Kawachi
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
mozk_
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
AimingStudy
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
dekosuke
 

Tendances (16)

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Lisp study
Lisp studyLisp study
Lisp study
 
Haskell超初心者勉強会20
Haskell超初心者勉強会20Haskell超初心者勉強会20
Haskell超初心者勉強会20
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functions
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
 
Collectionを使いこなす
Collectionを使いこなすCollectionを使いこなす
Collectionを使いこなす
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
Functional Way
Functional WayFunctional Way
Functional Way
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language Update
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 

En vedette

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 

En vedette (16)

Kotlinでテストコードを書く
Kotlinでテストコードを書くKotlinでテストコードを書く
Kotlinでテストコードを書く
 
3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API
 
Kotlinにお触り
Kotlinにお触りKotlinにお触り
Kotlinにお触り
 
Mobile automation – should I use robotium or calabash or appium?
Mobile automation – should I use robotium or calabash or appium?Mobile automation – should I use robotium or calabash or appium?
Mobile automation – should I use robotium or calabash or appium?
 
Java → Kotlin 変換 そのあとに。
Java → Kotlin 変換 そのあとに。Java → Kotlin 変換 そのあとに。
Java → Kotlin 変換 そのあとに。
 
Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例
 
Appium を使って iOS / Android の UI テストを共通化
Appium を使って iOS / Android の UI テストを共通化Appium を使って iOS / Android の UI テストを共通化
Appium を使って iOS / Android の UI テストを共通化
 
iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -
iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -
iOSアプリ開発のテスト環境 - テストをはじめる最初の一歩 -
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
ビックデータとPythonではじめる野球の統計分析 #pyconjp
ビックデータとPythonではじめる野球の統計分析 #pyconjpビックデータとPythonではじめる野球の統計分析 #pyconjp
ビックデータとPythonではじめる野球の統計分析 #pyconjp
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化
 
Ansibleはじめよぉ -Infrastructure as Codeを理解-
Ansibleはじめよぉ -Infrastructure as Codeを理解-Ansibleはじめよぉ -Infrastructure as Codeを理解-
Ansibleはじめよぉ -Infrastructure as Codeを理解-
 
Workshop: Docker on Elastic Beanstalk
Workshop: Docker on Elastic BeanstalkWorkshop: Docker on Elastic Beanstalk
Workshop: Docker on Elastic Beanstalk
 
耐巨大性を備えた表データ分析用コマンド群
耐巨大性を備えた表データ分析用コマンド群耐巨大性を備えた表データ分析用コマンド群
耐巨大性を備えた表データ分析用コマンド群
 

Similaire à kollectionの紹介

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
 

Similaire à kollectionの紹介 (17)

たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLang
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 

Plus de Kota Mizushima

こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
Kota Mizushima
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
Kota Mizushima
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
Kota Mizushima
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
Kota Mizushima
 

Plus de Kota Mizushima (20)

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
 
Macros in nemerle
Macros in nemerleMacros in nemerle
Macros in nemerle
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後
 
Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning Tips
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and Borrowing
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful libraries
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-
 

Dernier

Dernier (10)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

kollectionの紹介