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
980
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Jun Tomioka
July 29, 2019
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
310
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
7.6k
Write stack safe non-tailrec recursive functions
jooohn
4
900
Introduction to Clean Architecture
jooohn
1
540
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.6k
Work at M3 USA
jooohn
0
1.2k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.2k
怖くないCats
jooohn
0
760
Scalaの型クラスを完全に理解する
jooohn
5
1.8k
Other Decks in Technology
See All in Technology
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
490
Windows の新しい管理者保護モード
murachiakira
0
180
MIMEと文字コードの闇
hirachan
2
290
分解して理解する Aspire
nenonaninu
2
500
AIエージェント元年
shukob
0
130
Active Directory攻防
cryptopeg
PRO
8
4.6k
開発組織のための セキュアコーディング研修の始め方
flatt_security
3
2.7k
Autonomous Database Serverless 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
17
45k
AI エージェント開発を支える MaaS としての Azure AI Foundry
ryohtaka
6
650
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
160
Cloud Spanner 導入で実現した快適な開発と運用について
colopl
1
930
株式会社EventHub・エンジニア採用資料
eventhub
0
4.3k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
52k
Statistics for Hackers
jakevdp
797
220k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Rails Girls Zürich Keynote
gr2m
94
13k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
500
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
A Modern Web Designer's Workflow
chriscoyier
693
190k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
250
Faster Mobile Websites
deanohume
306
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を) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
おわり