Slide 1

Slide 1 text

Scalaのコンパイラに FizzBuzzを解いてもらう (Dottyもあるよ) @jooohn1234

Slide 2

Slide 2 text

Jun Tomioka @jooohn1234 Software Engineer at M3, Inc.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

恐ろしい!

Slide 6

Slide 6 text

FizzBuzz問題 ● 1~nまでの数について以下を出力する ○ 3で割り切れる場合は”Fizz” ○ 5で割り切れる場合は”Buzz” ○ 3でも5でも割り切れる場合は”FizzBuzz” ○ それ以外はその数

Slide 7

Slide 7 text

FizzBuzz問題 ● 1~nまでの数について以下を出力する ○ 3で割り切れる場合は”Fizz” ○ 5で割り切れる場合は”Buzz” ○ 3でも5でも割り切れる場合は”FizzBuzz” ○ それ以外はその数 NP困難 不可避

Slide 8

Slide 8 text

FizzBuzz問題 ● 1~nまでの数について以下を出力する ○ 3で割り切れる場合は”Fizz” ○ 5で割り切れる場合は”Buzz” ○ 3でも5でも割り切れる場合は”FizzBuzz” ○ それ以外はその数 全くわからん! *NP困難であることと問題自体が難しいことは関係がありません。

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。

Slide 11

Slide 11 text

(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。 なるほど!

Slide 12

Slide 12 text

FizzBuzzをコンパイラに解いてもらおう 1. コンパイラに数を認識してもらおう 2. コンパイラに数値演算をしてもらおう 3. コンパイラに割り切れる判定をしてもらおう 4. コンパイラに条件分岐してもらおう 5. コンパイラに繰り返してもらおう 6. コンパイラにFizzBuzzを解いてもらおう

Slide 13

Slide 13 text

1. コンパイラに数を認識してもらおう

Slide 14

Slide 14 text

1. コンパイラに数を認識してもらおう 自然数は0または別のある自然数の次、と定義 (peano number)

Slide 15

Slide 15 text

1. コンパイラに数を認識してもらおう 0と1を区別してくれるようになった!

Slide 16

Slide 16 text

1. コンパイラに数を認識してもらおう 整数型に変換する方法も用意しておく

Slide 17

Slide 17 text

1. コンパイラに数を認識してもらおう (optional) 0~5くらいまで定義しておくと便利

Slide 18

Slide 18 text

2. コンパイラに数値計算をしてもらおう

Slide 19

Slide 19 text

2. コンパイラに数値計算をしてもらおう まずはimplicitの解決をおさらい

Slide 20

Slide 20 text

2. コンパイラに数値計算をしてもらおう まずはimplicitの解決をおさらい

Slide 21

Slide 21 text

2. コンパイラに数値計算をしてもらおう 引き算

Slide 22

Slide 22 text

2. コンパイラに数値計算をしてもらおう

Slide 23

Slide 23 text

3. コンパイラに割り切れる判定をしてもらおう

Slide 24

Slide 24 text

3. コンパイラに割り切れる判定をしてもらおう

Slide 25

Slide 25 text

3. コンパイラに割り切れる判定をしてもらおう

Slide 26

Slide 26 text

4. コンパイラに条件分岐してもらおう

Slide 27

Slide 27 text

implicitの解決の順序をおさらい 4. コンパイラに条件分岐してもらおう

Slide 28

Slide 28 text

3でも5でも割り切れる場合を優先度高く 4. コンパイラに条件分岐してもらおう

Slide 29

Slide 29 text

4. コンパイラに条件分岐してもらおう

Slide 30

Slide 30 text

5. コンパイラに繰り返してもらおう

Slide 31

Slide 31 text

5. コンパイラに繰り返してもらおう

Slide 32

Slide 32 text

5. コンパイラに繰り返してもらおう

Slide 33

Slide 33 text

6. コンパイラにFizzBuzzを解いてもらおう

Slide 34

Slide 34 text

6. コンパイラにFizzBuzzを解いてもらおう

Slide 35

Slide 35 text

6. コンパイラにFizzBuzzを解いてもらおう

Slide 36

Slide 36 text

6. コンパイラにFizzBuzzを解いてもらおう

Slide 37

Slide 37 text

ifとかforとか知ら んけどFizzBuzzで きた!

Slide 38

Slide 38 text

Dotty編

Slide 39

Slide 39 text

1. コンパイラに数を認識してもらおう

Slide 40

Slide 40 text

1. コンパイラに数を認識してもらおう (Dotty) もうある scala.compiletime.S https://github.com/lampepfl/dotty/blob/master/library/src/scala/compiletime/package.scala

Slide 41

Slide 41 text

1. コンパイラに数を認識してもらおう (Dotty) 型から値の導出も

Slide 42

Slide 42 text

2. コンパイラに数値計算をしてもらおう

Slide 43

Slide 43 text

match type で超簡単 2. コンパイラに数値計算をしてもらおう (Dotty)

Slide 44

Slide 44 text

match type で超簡単 2. コンパイラに数値計算をしてもらおう (Dotty)

Slide 45

Slide 45 text

でかい計算はできないので注意 2. コンパイラに数値計算をしてもらおう (Dotty)

Slide 46

Slide 46 text

3. コンパイラに割り切れる判定をしてもらおう

Slide 47

Slide 47 text

match type で超簡単 3. コンパイラに割り切れる判定をしてもらおう (Dotty)

Slide 48

Slide 48 text

match type で超簡単 3. コンパイラに割り切れる判定をしてもらおう (Dotty)

Slide 49

Slide 49 text

4. コンパイラに条件分岐してもらおう

Slide 50

Slide 50 text

match type で超簡単 4. コンパイラに条件分岐してもらおう (Dotty)

Slide 51

Slide 51 text

match type で超簡単 4. コンパイラに条件分岐してもらおう (Dotty)

Slide 52

Slide 52 text

5. コンパイラに繰り返してもらおう

Slide 53

Slide 53 text

標準ライブラリで用意されているTupleが便利 5. コンパイラに繰り返してもらおう (Dotty)

Slide 54

Slide 54 text

6. コンパイラにFizzBuzzを解いてもらおう

Slide 55

Slide 55 text

inline * erasedValueの組み合わせで、気軽に型を 値にmappingする処理がかける 6. コンパイラにFizzBuzzを解いてもらおう (Dotty)

Slide 56

Slide 56 text

完成! https://gist.github.com/jooohn/e0bfcfeeeed6a33369f7a12d20e522ad

Slide 57

Slide 57 text

まとめ

Slide 58

Slide 58 text

● implicitの機能をうまく使ってコンパイラに FizzBuzzを解いてもらえた ○ 「コードが書けないプログラマ志願者」と言われずにすみそ う! ● Dottyは難しいこと考えなくても型レベルプログラミ ングができるが、簡単すぎて面白くないという欠点 がある(欠点ではない) まとめ

Slide 59

Slide 59 text

(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。

Slide 60

Slide 60 text

おわり