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
830
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
Jun Tomioka
July 29, 2019
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
250
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
7.2k
Write stack safe non-tailrec recursive functions
jooohn
4
730
Introduction to Clean Architecture
jooohn
1
520
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.5k
Work at M3 USA
jooohn
0
1.1k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1k
怖くないCats
jooohn
0
670
Scalaの型クラスを完全に理解する
jooohn
5
1.6k
Other Decks in Technology
See All in Technology
Google Cloud Next '24 Recap(Cloud Run/k8s)
mokocm
0
140
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
1
450
エンジニア候補者向け資料2024.04.24.pdf
macloud
0
3.3k
VSCodeの拡張機能を作っている話
ebarakazuhiro
1
380
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
550
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
240
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
エンジニアのキャリアをちょっと楽しくする3本の軸/Three Pillars to Make an Engineer's Career More Enjoyable
kwappa
0
2.7k
GrafanaMeetup_AmazonManagedGrafanaのアクセス制御機能とマルチテナント環境下でのアクセス制御について
daitak
0
130
KubeCon EU 2024 Recap “Kubernetes Policy Time Machine: Where to Next?”
ryysud
0
210
本当のAWS基礎
toru_kubota
0
510
Featured
See All Featured
A better future with KSS
kneath
231
16k
The Brand Is Dead. Long Live the Brand.
mthomps
49
28k
4 Signs Your Business is Dying
shpigford
175
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
355
18k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
Gamification - CAS2011
davidbonilla
76
4.6k
The Invisible Customer
myddelton
114
12k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
6
1.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
Imperfection Machines: The Place of Print at Facebook
scottboms
260
12k
Side Projects
sachag
451
41k
Happy Clients
brianwarren
92
6.4k
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を) 自力で解けないなら、 コンパイラに 解いてもらえば いいじゃない。
おわり