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のコンパイラに 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
おわり