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の型クラスを完全に理解する
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Jun Tomioka
August 23, 2018
Technology
2.1k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Scalaの型クラスを完全に理解する
Jun Tomioka
August 23, 2018
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
380
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
8k
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
jooohn
1
1.2k
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.4k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.4k
怖くないCats
jooohn
0
920
Other Decks in Technology
See All in Technology
入門!AWS Blocks
ysuzuki
1
160
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.6k
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
110
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.5k
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
170
AIはどのように 組織のアジリティを変えるのか?
junki
4
1.1k
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
1
240
SteampipeとExcel Power QueryでAWS構成定義書の作成を自動化する
jhashimoto
0
160
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
320
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
240
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
170
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
420
Chasing Engaging Ingredients in Design
codingconduct
0
220
The untapped power of vector embeddings
frankvandijk
2
1.8k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
320
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
630
Transcript
Scalaの型クラスを 完全に理解する @jooohn1234
M3, Inc. @jooohn1234 じょんと呼んでください!
型クラス (Type Classes)
型クラス is
型のクラス
型クラス is 型のクラス
うんうん、わかるわかる!
None
None
型クラスは 同様の型のひとまとまり
雰囲気 0, 100, -50 Int ??? データ 型 型クラス インスタンス
インスタンス クラス クラス
Wikipedia
“a type class is a type system construct that supports
ad hoc polymorphism. ”
うんうん、わかるわかる!
“... is also known as function overloading or operator overloading.
”
型クラスは 同様の型のまとまりで Function Overloadingを実現す る型システム上の機構
JsonEncoder 型クラスのイメージ • def toJson(value: ???): Json • こんなことができそう ◦
toJson(1) ◦ toJson(“hoge”) ◦ toJson(User(userId = 1, name = “jooohn”))
Scalaでの型クラス
1. 型クラスとなるtraitを宣言
1. 型クラスとなるtraitを宣言 型パラメータで型クラスの インスタンスの型を受け取 るようにする
1. 型クラスとなるtraitを宣言 JsonEncoder[A]の値が 存在するとき AはJsonEncoder型クラ スのインスタンス
2. 型クラスのインスタンスを作成 (implicit)
2. 型クラスのインスタンスを作成 (implicit) StringはJsonEncode型 クラスのインスタンス
3. 型クラスをimplicitに利用するメソッドを定義
3. 型クラスをimplicitに利用するメソッドを定義 JsonEncode[A] 型の値を implicitスコープから参照
4. 値(の型)によっていい感じに処理をoverload
わからないでもない!
それで、subtypingと比べて なにがうれしいの?
これでもいいような
Scalaで型クラスを使うn個の理由 1. finalな型の拡張 2. 値に依存しない関数の定義 3. scopeのコントロール 4. インスタンスの導出 5.
解決する課題の違い
1. finalな型の拡張
1. Final なクラスの拡張 • Scala標準ライブラリなどで定義されている クラスなんかも拡張できる
2. 値に依存しない関数の定義
2. 値に依存しない関数の定義 • JsonDecoderを普通のtraitの使い方では 作れない。(Json => A のシグネチャ)
2. 値に依存しない関数の定義
3. スコープのコントロール
3. scopeのコントロール
4. インスタンスの導出
4. インスタンスの導出 • implicit def を用いた動的なインスタンス生 成
4. インスタンスの導出 • implicit def を用いた動的なインスタンス生 成
4. インスタンスの導出 • (Advanced) shapelessを用いたcase classか らのインスタンス導出
4. インスタンスの導出 • (Advanced) shapelessを用いたcase classか らのインスタンス導出
5. 解決する課題の違い
5. 解決する課題の違い モチベーション 利用時の型 subtyping 複数の型のインスタン スを、抽象型として扱い たい。 abstract: val
strategy: Strategy = SimpleStrategy type classes 任意の型に関して行う 共通処理を提供した い。 concrete: toJson(1: Long)
5. 解決する課題の違い 0, 100, -50 Int JsonEncoder データ 型 型クラス
インスタンス インスタンス クラス クラス subtyping
完全に理解した!