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.1k
1
Share
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Jun Tomioka
July 29, 2019
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
380
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
8k
Write stack safe non-tailrec recursive functions
jooohn
4
1k
Introduction to Clean Architecture
jooohn
1
600
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.8k
Work at M3 USA
jooohn
0
1.4k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.4k
怖くないCats
jooohn
0
910
Scalaの型クラスを完全に理解する
jooohn
5
2.1k
Other Decks in Technology
See All in Technology
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
2
100
Java正規表現エンジン(NFA)の仕組みと パフォーマンスを維持するための最適化手法
takeuchi_132917
0
180
ルールやカスタム機能、どう使う?理想の出力を引き出すために今知りたいIBM Bob 5つの機能
muehara
1
310
イベントストーミングとKiroの仕様駆動開発で実現する要件の認識合わせプロセス
syobochim
7
1.1k
最低限これだけ押さえれ大丈夫_Claude Enterprise/Team企業展開ガバナンス入門
tkikuchi
1
720
Sony_KMP_Journey_KotlinConf2026
sony
2
210
Unlocking the Apps
pimterry
0
190
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
250
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
220
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
6
3.1k
Terraformモジュールは、なぜ「魔境」化するのか
hayama17
1
180
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.1k
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Being A Developer After 40
akosma
91
590k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Curse of the Amulet
leimatthew05
1
13k
Building an army of robots
kneath
306
46k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
210
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Designing Experiences People Love
moore
143
24k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.3k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
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を) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
おわり