$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scalaの型クラスを完全に理解する
Search
Jun Tomioka
August 23, 2018
Technology
5
2k
Scalaの型クラスを完全に理解する
Jun Tomioka
August 23, 2018
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
360
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
7.9k
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
jooohn
1
1.1k
Write stack safe non-tailrec recursive functions
jooohn
4
980
Introduction to Clean Architecture
jooohn
1
580
人類には早すぎる、謎の計算ロジックに立ち向かう / Strugle with the most complicated logic ever
jooohn
1
1.7k
Work at M3 USA
jooohn
0
1.4k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.3k
怖くないCats
jooohn
0
860
Other Decks in Technology
See All in Technology
まだ間に合う! Agentic AI on AWSの現在地をやさしく一挙おさらい
minorun365
17
2.6k
JEDAI認定プログラム JEDAI Order 2026 エントリーのご案内 / JEDAI Order 2026 Entry
databricksjapan
0
180
【開発を止めるな】機能追加と並行して進めるアーキテクチャ改善/Keep Shipping: Architecture Improvements Without Pausing Dev
bitkey
PRO
1
120
20251203_AIxIoTビジネス共創ラボ_第4回勉強会_BP山崎.pdf
iotcomjpadmin
0
130
Introduce marp-ai-slide-generator
itarutomy
0
110
Snowflake導入から1年、LayerXのデータ活用の現在 / One Year into Snowflake: How LayerX Uses Data Today
civitaspo
0
2.3k
日本Rubyの会: これまでとこれから
snoozer05
PRO
5
230
Entity Framework Core におけるIN句クエリ最適化について
htkym
0
120
AI with TiDD
shiraji
1
270
「図面」から「法則」へ 〜メタ視点で読み解く現代のソフトウェアアーキテクチャ〜
scova0731
0
490
シニアソフトウェアエンジニアになるためには
kworkdev
PRO
3
270
Identity Management for Agentic AI 解説
fujie
0
450
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
55
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
250
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
88
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
710
The Limits of Empathy - UXLibs8
cassininazir
1
190
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Paper Plane
katiecoart
PRO
0
44k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
120
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
完全に理解した!