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

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

75086cfa4a46d4aa47deb38b409bd9cd?s=128

Jun Tomioka

July 29, 2019
Tweet

Transcript

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

  2. Jun Tomioka @jooohn1234 Software Engineer at M3, Inc.

  3. None
  4. None
  5. 恐ろしい!

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

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

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

    それ以外はその数 全くわからん! *NP困難であることと問題自体が難しいことは関係がありません。
  9. None
  10. (FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。

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

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

    コンパイラに繰り返してもらおう 6. コンパイラにFizzBuzzを解いてもらおう
  13. 1. コンパイラに数を認識してもらおう

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  38. Dotty編

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  57. まとめ

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

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

  60. おわり