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
Jun Tomioka
August 23, 2018
Technology
5
1.7k
Scalaの型クラスを完全に理解する
Jun Tomioka
August 23, 2018
Tweet
Share
More Decks by Jun Tomioka
See All by Jun Tomioka
Dotty で軽量な DI ライブラリをかいてみた
jooohn
1
260
ソフトウェアエンジニアとしてモナドを完全に理解する / make-perfect-sense-of-monad
jooohn
14
7.3k
ScalaのコンパイラにFizzBuzzを解いてもらう(Dottyもあるよ)
jooohn
1
870
Write stack safe non-tailrec recursive functions
jooohn
4
790
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.2k
クラウド電子カルテを支えるテクノロジーの光と闇
jooohn
0
1.1k
怖くないCats
jooohn
0
690
Other Decks in Technology
See All in Technology
E2Eテスト自動化プラットフォームにおけるAIの活用
shift_evolve
0
180
大規模ドラレコデータ収集・機械学習基盤を支える AWS CDK 〜導入・運用事例紹介〜
pemugi
0
110
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
プレイドにおけるDatadog APMの活用方法
plaidtech
PRO
2
120
さらに高品質・高速化を目指すAI時代のテスト設計支援と、めざす先 / AI Test Lab vol.1
shift_evolve
0
190
クラウド利用者の「責任」をどう果たす?AWSセキュリティ対策のススメ #AWSSummit
hiashisan
0
270
開発生産性をむしろ向上させる セキュリティパートナーの作り方 / Dev Productivity Con 2024
flatt_security
0
360
Docker互換のセキュアなコンテナ実行環境「Podman」超入門
devops_vtj
6
3.2k
年間一億円削減した時系列データベースのアーキテクチャ改善~不確実性の高いプロジェクトへの挑戦~
lycorptech_jp
PRO
3
2.9k
What if...? 처음부터 다시 LLM 어플리케이션을 개발한다면
huffon
0
1k
目標設定は好きですか? アジャイルとともに目標と向き合い続ける方法 / Do you like target Management?
kakehashi
10
3k
RAGのサービスをリリースして1年3ヶ月が経ちました
segavvy
4
910
Featured
See All Featured
KATA
mclloyd
20
13k
Designing the Hi-DPI Web
ddemaree
276
34k
Why Our Code Smells
bkeepers
PRO
332
56k
Clear Off the Table
cherdarchuk
89
320k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
78
15k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
What the flash - Photography Introduction
edds
65
11k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
662
120k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
52k
Making Projects Easy
brettharned
111
5.7k
No one is an island. Learnings from fostering a developers community.
thoeni
17
2.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
17
8.7k
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
完全に理解した!