Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Scalaの型クラスを 完全に理解する @jooohn1234
Slide 2
Slide 2 text
M3, Inc. @jooohn1234 じょんと呼んでください!
Slide 3
Slide 3 text
型クラス (Type Classes)
Slide 4
Slide 4 text
型クラス is
Slide 5
Slide 5 text
型のクラス
Slide 6
Slide 6 text
型クラス is 型のクラス
Slide 7
Slide 7 text
うんうん、わかるわかる!
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
型クラスは 同様の型のひとまとまり
Slide 11
Slide 11 text
雰囲気 0, 100, -50 Int ??? データ 型 型クラス インスタンス インスタンス クラス クラス
Slide 12
Slide 12 text
Wikipedia
Slide 13
Slide 13 text
“a type class is a type system construct that supports ad hoc polymorphism. ”
Slide 14
Slide 14 text
うんうん、わかるわかる!
Slide 15
Slide 15 text
“... is also known as function overloading or operator overloading. ”
Slide 16
Slide 16 text
型クラスは 同様の型のまとまりで Function Overloadingを実現す る型システム上の機構
Slide 17
Slide 17 text
JsonEncoder 型クラスのイメージ ● def toJson(value: ???): Json ● こんなことができそう ○ toJson(1) ○ toJson(“hoge”) ○ toJson(User(userId = 1, name = “jooohn”))
Slide 18
Slide 18 text
Scalaでの型クラス
Slide 19
Slide 19 text
1. 型クラスとなるtraitを宣言
Slide 20
Slide 20 text
1. 型クラスとなるtraitを宣言 型パラメータで型クラスの インスタンスの型を受け取 るようにする
Slide 21
Slide 21 text
1. 型クラスとなるtraitを宣言 JsonEncoder[A]の値が 存在するとき AはJsonEncoder型クラ スのインスタンス
Slide 22
Slide 22 text
2. 型クラスのインスタンスを作成 (implicit)
Slide 23
Slide 23 text
2. 型クラスのインスタンスを作成 (implicit) StringはJsonEncode型 クラスのインスタンス
Slide 24
Slide 24 text
3. 型クラスをimplicitに利用するメソッドを定義
Slide 25
Slide 25 text
3. 型クラスをimplicitに利用するメソッドを定義 JsonEncode[A] 型の値を implicitスコープから参照
Slide 26
Slide 26 text
4. 値(の型)によっていい感じに処理をoverload
Slide 27
Slide 27 text
わからないでもない!
Slide 28
Slide 28 text
それで、subtypingと比べて なにがうれしいの?
Slide 29
Slide 29 text
これでもいいような
Slide 30
Slide 30 text
Scalaで型クラスを使うn個の理由 1. finalな型の拡張 2. 値に依存しない関数の定義 3. scopeのコントロール 4. インスタンスの導出 5. 解決する課題の違い
Slide 31
Slide 31 text
1. finalな型の拡張
Slide 32
Slide 32 text
1. Final なクラスの拡張 ● Scala標準ライブラリなどで定義されている クラスなんかも拡張できる
Slide 33
Slide 33 text
2. 値に依存しない関数の定義
Slide 34
Slide 34 text
2. 値に依存しない関数の定義 ● JsonDecoderを普通のtraitの使い方では 作れない。(Json => A のシグネチャ)
Slide 35
Slide 35 text
2. 値に依存しない関数の定義
Slide 36
Slide 36 text
3. スコープのコントロール
Slide 37
Slide 37 text
3. scopeのコントロール
Slide 38
Slide 38 text
4. インスタンスの導出
Slide 39
Slide 39 text
4. インスタンスの導出 ● implicit def を用いた動的なインスタンス生 成
Slide 40
Slide 40 text
4. インスタンスの導出 ● implicit def を用いた動的なインスタンス生 成
Slide 41
Slide 41 text
4. インスタンスの導出 ● (Advanced) shapelessを用いたcase classか らのインスタンス導出
Slide 42
Slide 42 text
4. インスタンスの導出 ● (Advanced) shapelessを用いたcase classか らのインスタンス導出
Slide 43
Slide 43 text
5. 解決する課題の違い
Slide 44
Slide 44 text
5. 解決する課題の違い モチベーション 利用時の型 subtyping 複数の型のインスタン スを、抽象型として扱い たい。 abstract: val strategy: Strategy = SimpleStrategy type classes 任意の型に関して行う 共通処理を提供した い。 concrete: toJson(1: Long)
Slide 45
Slide 45 text
5. 解決する課題の違い 0, 100, -50 Int JsonEncoder データ 型 型クラス インスタンス インスタンス クラス クラス subtyping
Slide 46
Slide 46 text
完全に理解した!