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

完全に理解した!