Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Search
Jun Tomioka
July 29, 2019
Technology
1
900
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Jun Tomioka
July 29, 2019
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
270
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
7.4k
Write stack safe non-tailrec recursive functions
jooohn
4
830
Introduction to Clean Architecture
jooohn
1
530
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.6k
Work at M3 USA
jooohn
0
1.2k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.1k
怖くないCats
jooohn
0
700
Scalaの型クラスを完全に理解する
jooohn
5
1.7k
Other Decks in Technology
See All in Technology
Fediverse Discovery Providers overview
andypiper
0
150
エンジニア視点で見る、 組織で運用されるデザインシステムにするには
shunya078
1
300
どこよりも遅めなWinActor Ver.7.5.0 新機能紹介
tamai_63
0
100
音声AIエージェントの世界とRetell AI入門 / Introduction to the World of Voice AI Agents and Retell AI
rkaga
5
920
四国のあのイベントの〇〇システムを45日間で構築した話 / cloudohenro2024_tachibana
biatunky
0
310
リアルお遍路+SORACOM IoT
ozk009
1
120
「家族アルバム みてね」における運用管理・ オブザーバビリティの全貌 / Overview of Operation Management and Observability in FamilyAlbum
isaoshimizu
4
150
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
4
2k
Creative UIs with Compose: DroidKaigi 2024
chrishorner
1
230
PDF Viewer作成の今までとこれから
hunachi
0
280
OR学会2024秋_短期収益と将来のオフ方策評価性能を考慮したクーポン割当方策混合比の決定
recruitengineers
PRO
4
430
AI活用したくてもできなかった不動産SaaSの今とこれから
nealle
0
260
Featured
See All Featured
Six Lessons from altMBA
skipperchong
26
3.3k
Principles of Awesome APIs and How to Build Them.
keavy
125
16k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
326
21k
Adopting Sorbet at Scale
ufuk
73
8.9k
A better future with KSS
kneath
235
17k
RailsConf 2023
tenderlove
28
800
Documentation Writing (for coders)
carmenintech
65
4.3k
Debugging Ruby Performance
tmm1
72
12k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Designing for humans not robots
tammielis
248
25k
What's new in Ruby 2.0
geeforr
340
31k
Transcript
Scalaのコンパイラに FizzBuzzを解いてもらう (Dottyもあるよ) @jooohn1234
Jun Tomioka @jooohn1234 Software Engineer at M3, Inc.
None
None
恐ろしい!
FizzBuzz問題 • 1~nまでの数について以下を出力する ◦ 3で割り切れる場合は”Fizz” ◦ 5で割り切れる場合は”Buzz” ◦ 3でも5でも割り切れる場合は”FizzBuzz” ◦
それ以外はその数
FizzBuzz問題 • 1~nまでの数について以下を出力する ◦ 3で割り切れる場合は”Fizz” ◦ 5で割り切れる場合は”Buzz” ◦ 3でも5でも割り切れる場合は”FizzBuzz” ◦
それ以外はその数 NP困難 不可避
FizzBuzz問題 • 1~nまでの数について以下を出力する ◦ 3で割り切れる場合は”Fizz” ◦ 5で割り切れる場合は”Buzz” ◦ 3でも5でも割り切れる場合は”FizzBuzz” ◦
それ以外はその数 全くわからん! *NP困難であることと問題自体が難しいことは関係がありません。
None
(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。 なるほど!
FizzBuzzをコンパイラに解いてもらおう 1. コンパイラに数を認識してもらおう 2. コンパイラに数値演算をしてもらおう 3. コンパイラに割り切れる判定をしてもらおう 4. コンパイラに条件分岐してもらおう 5.
コンパイラに繰り返してもらおう 6. コンパイラにFizzBuzzを解いてもらおう
1. コンパイラに数を認識してもらおう
1. コンパイラに数を認識してもらおう 自然数は0または別のある自然数の次、と定義 (peano number)
1. コンパイラに数を認識してもらおう 0と1を区別してくれるようになった!
1. コンパイラに数を認識してもらおう 整数型に変換する方法も用意しておく
1. コンパイラに数を認識してもらおう (optional) 0~5くらいまで定義しておくと便利
2. コンパイラに数値計算をしてもらおう
2. コンパイラに数値計算をしてもらおう まずはimplicitの解決をおさらい
2. コンパイラに数値計算をしてもらおう まずはimplicitの解決をおさらい
2. コンパイラに数値計算をしてもらおう 引き算
2. コンパイラに数値計算をしてもらおう
3. コンパイラに割り切れる判定をしてもらおう
3. コンパイラに割り切れる判定をしてもらおう
3. コンパイラに割り切れる判定をしてもらおう
4. コンパイラに条件分岐してもらおう
implicitの解決の順序をおさらい 4. コンパイラに条件分岐してもらおう
3でも5でも割り切れる場合を優先度高く 4. コンパイラに条件分岐してもらおう
4. コンパイラに条件分岐してもらおう
5. コンパイラに繰り返してもらおう
5. コンパイラに繰り返してもらおう
5. コンパイラに繰り返してもらおう
6. コンパイラにFizzBuzzを解いてもらおう
6. コンパイラにFizzBuzzを解いてもらおう
6. コンパイラにFizzBuzzを解いてもらおう
6. コンパイラにFizzBuzzを解いてもらおう
ifとかforとか知ら んけどFizzBuzzで きた!
Dotty編
1. コンパイラに数を認識してもらおう
1. コンパイラに数を認識してもらおう (Dotty) もうある scala.compiletime.S https://github.com/lampepfl/dotty/blob/master/library/src/scala/compiletime/package.scala
1. コンパイラに数を認識してもらおう (Dotty) 型から値の導出も
2. コンパイラに数値計算をしてもらおう
match type で超簡単 2. コンパイラに数値計算をしてもらおう (Dotty)
match type で超簡単 2. コンパイラに数値計算をしてもらおう (Dotty)
でかい計算はできないので注意 2. コンパイラに数値計算をしてもらおう (Dotty)
3. コンパイラに割り切れる判定をしてもらおう
match type で超簡単 3. コンパイラに割り切れる判定をしてもらおう (Dotty)
match type で超簡単 3. コンパイラに割り切れる判定をしてもらおう (Dotty)
4. コンパイラに条件分岐してもらおう
match type で超簡単 4. コンパイラに条件分岐してもらおう (Dotty)
match type で超簡単 4. コンパイラに条件分岐してもらおう (Dotty)
5. コンパイラに繰り返してもらおう
標準ライブラリで用意されているTupleが便利 5. コンパイラに繰り返してもらおう (Dotty)
6. コンパイラにFizzBuzzを解いてもらおう
inline * erasedValueの組み合わせで、気軽に型を 値にmappingする処理がかける 6. コンパイラにFizzBuzzを解いてもらおう (Dotty)
完成! https://gist.github.com/jooohn/e0bfcfeeeed6a33369f7a12d20e522ad
まとめ
• implicitの機能をうまく使ってコンパイラに FizzBuzzを解いてもらえた ◦ 「コードが書けないプログラマ志願者」と言われずにすみそ う! • Dottyは難しいこと考えなくても型レベルプログラミ ングができるが、簡単すぎて面白くないという欠点 がある(欠点ではない)
まとめ
(FizzBuzzを) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
おわり