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.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Jun Tomioka
July 29, 2019
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
390
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
8k
Write stack safe non-tailrec recursive functions
jooohn
4
1k
Introduction to Clean Architecture
jooohn
1
610
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.8k
Work at M3 USA
jooohn
0
1.5k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.4k
怖くないCats
jooohn
0
930
Scalaの型クラスを完全に理解する
jooohn
5
2.1k
Other Decks in Technology
See All in Technology
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
2
720
Claude Codeで開発以外の業務も爆速化しよう!
minorun365
PRO
11
9k
VPCでもFloatingIPを使いたいんだ
y_kotani
1
130
DMMブックスのNext.js化を加速させるAI活用 / Migrating DMM Books to Next.js with AI
kentarom
0
180
Oracle AI Databaseデータベース・サービス: BaseDB/ExaDB-Dの可用性
oracle4engineer
PRO
1
960
1.5時間を無駄にして学んだwsl2におけるaptとsnapの選択と仕組み
yosaka0123
0
460
hookで自作する Claude Code の「実況ボード」
shinyasaita
2
230
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
480
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
どんな手を使っても絶対間に合わせるスケジューラ
asari194617
0
1.5k
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
290
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
A Modern Web Designer's Workflow
chriscoyier
698
190k
KATA
mclloyd
PRO
35
15k
Making Projects Easy
brettharned
120
6.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Become a Pro
speakerdeck
PRO
31
6.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Darren the Foodie - Storyboard
khoart
PRO
3
3.8k
WCS-LA-2024
lcolladotor
0
810
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.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を) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
おわり