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
Introduction to Scala about type parameter
Search
Yukiyan
August 04, 2020
Programming
0
170
Introduction to Scala about type parameter
2020/08/04 社内LT
Scala 入門 Ⅱ
型パラメータ, 変位指定,
型境界, そして陰陽術へ...
Yukiyan
August 04, 2020
Tweet
Share
More Decks by Yukiyan
See All by Yukiyan
Introduction to Scala
yukiyan
0
92
digdagで支えるデータパイプライン / Building a data pipeline with digdag
yukiyan
1
5.8k
機械学習基盤を一人で構築するということ / Hitori ml team
yukiyan
3
3.7k
ECSのデプロイツールを試している話
yukiyan
0
2.5k
Replace a batch application to ECS
yukiyan
1
1.6k
Introduction to Docker
yukiyan
0
5.8k
Other Decks in Programming
See All in Programming
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
3
1.9k
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.4k
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
440
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
400
Claude Codeログ基盤の構築
giginet
PRO
7
3.6k
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
130
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.1k
PHP 7.4でもOpenTelemetryゼロコード計装がしたい! / PHPerKaigi 2026
arthur1
1
410
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
120
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
230
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
160
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
160
Ruling the World: When Life Gets Gamed
codingconduct
0
180
Become a Pro
speakerdeck
PRO
31
5.9k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
89
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
460
A Soul's Torment
seathinner
5
2.5k
Exploring anti-patterns in Rails
aemeredith
2
290
Art, The Web, and Tiny UX
lynnandtonic
304
21k
The Language of Interfaces
destraynor
162
26k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Transcript
Scala 入門 Ⅱ 型パラメータ, 変位指定, 型境界, そして陰陽術へ... ゆきやん 1
教材 2
前回の復習 ・基本的な文法 ・ケースクラス ・トレイト 3
基本的な文法 4
ケースクラス • Value Object 使うときに役立つ 5
トレイト • Java のインターフェースみたいなやつ • 複数のトレイトを 1つのクラスやトレイトにミックスインできる • 直接インスタンス化できない 6
今回学ぶこと ・型パラメーター(いわゆるジェネリクス) ・変位指定 ・型境界 ・陰陽(Checking variance annotations) 7
型パラメーター ・型をパラメーターとして持つことができる ・Array[Int] や List[String] のように要素の型を与えることで具体化す るようなクラスをつくるのに便利 ・クラスの定義時には予測できない要素の型に対応でき、要素自体も 安全に取り扱える ・どのような型が渡されても動作するコードを書きたいときに便利
・具体例は次ページにて ... 8
・Scala特有のというより、型パラメータやジェネリクスという抽象化技 法の便利さ ・静的型付け言語の多くで採用されてる理由がわかった気がする 9
ここで、とあるJavaコードを見てみる ・StringはObjectのサブクラスだしコンパイルは通る ・実行時例外 ArrayStoreException が投げられる 10
Scalaでは変位指定という仕組みで検出できる ・コンパイル時エラーで検出できる ・継承関係は型パラメーターに必ずしも引き継がれるわけではない 11
変位指定 ・変位指定は型パラメーターの性質を制御できる ・ScalaのArrayは非変 https://github.com/Scala/Scala/blob/v2.13.3/src/library/Scala/Array.Scala#L627 ・JavaのArrayは共変 ・非変と共変はわかるけど、反変はいつ役に立つのか ... 下記リンク参照. ・[Scalaの変位指定をすると、何が嬉しいのか。反変編 -
Re.Ra.Ku tech blog](http://techblog.reraku.co.jp/entry/2016/06/12/135411) 共変(covariant) class Foo[+A] AがBのサブタイプであるような AとBに対し Foo[A]がFoo[B]のサブタイプであること 反変(contravariant) class Foo[-A] AがBのサブタイプであるような AとBに対し Foo[B]がFoo[A]のサブタイプであること 非変(invariant) class Foo[A] 共変でも反変でもない。継承関係は相関されな い。 12
ちなみに... ・JavaはArrayだけが共変で、他は非変。 Listとか。 ・作者いわく、もともとこういうことを実現したかったので共変にしたらし い ・上記はJavaのジェネリクスを使えば書ける ・なので、これはジェネリクス登場以前の名残であって、後方互換性を 維持するためにそのままにしてある 13
非変がうまく働いている例 14
非変でつくるべきものを共変でつくろうとしてみる ・エラー意訳:「反変(contravariant)ポジションであるべきところに共変 (covariant)なAが使われてる」 ・どういうことだ... ポジションとは...? 15
コンパイラによる変位指定のチェック ・Scalaコンパイラは、あらゆるポジション (型名を書く場所)を陽性、陰性、中性に分類することで、変位指定された型 パラメーターに関する安全性を保証している。 陽性(positive) 非変か共変しか指定できない 陰性(negative) 非変か反変しか指定できない 中性(neutral) 非変のみ
16
自分で考えるとめちゃくちゃややこしいので基本はコンパイラに任せよう! 17
共変なCellはどうつくればいいのか ・共変が危険なのではなくて、共変と mutableな性質が合わさることが危険 (例: さっきのJavaのコード) ・この例はmutableなCellは共変にはできないようになっているという例 ・Immutableにすれば共変にできる !?... 次ページへ 18
型境界 上限境界 def foo[T <: A] 型パラメータTが型Aのサブタイプなら許容する 下限境界 def foo[T
>: A] 型パラメータTが型Aのスーパータイプなら許容 する 19
20
まとめ ・Scalaには他の静的型付け言語同様にジェネリクスがあり、型パラ メーターと呼ばれている ・型パラメーターの性質を制御できる変位指定というものがあり、クラ スの安全性を高められる 共変(covariant) class Foo[+A] AがBのサブタイプであるような AとBに対し
Foo[A]がFoo[B]のサブタイプであること 反変(contravariant) class Foo[-A] AがBのサブタイプであるような AとBに対し Foo[B]がFoo[A]のサブタイプであること 非変(invariant) class Foo[A] 共変でも反変でもない。継承関係は相関されない ・Scalaコンパイラは、あらゆるポジション (型名を書く場所)を陽性、陰 性、中性に分類することで、変位指定された型パラメーターに関する 安全性を保証している。 陽性(positive) 非変か共変しか指定できない 陰性(negative) 非変か反変しか指定できない 中性(neutral) 非変のみ ・型境界を使うと、より柔軟な型パラメーターを使ったクラスを作成で きる 上限境界 def foo[T <: A] 型パラメータTが型Aのサブタイプなら許容する 下限境界 def foo[T >: A] 型パラメータTが型Aのスーパータイプなら許容する 【変位指定】 【変位指定のチェック】 【型境界】 21
型クラス(≒implicit parameter)は、うまく使うと、後付けのデータ型に対して既存のアルゴリズムを型安全に 適用するのに使うことができます。 この特徴は、特にライブラリ設計のときに重要になってきます。 ライブラリ設計時点で定義されていないデータ型に対していかにしてライブラリのアルゴリズムを適用する か、つまり、拡張性が高いように作るかというのは、なかなか難しい問題です。 簡潔に書けることを重視すると、拡張性が狭まりがちですし、拡張性が高いように作ると、デフォルトの動作で いいところを毎回書かなくてはいけなくて利用者にとって不便です。 型クラスを使ったライブラリを提供することによって、この問題をある程度緩和することができます。 皆さんも、型クラスを使って、既存の問題をより簡潔に、拡張性が高く解決できないか考えてみてください。
型クラスへの誘い · Scala研修テキスト 前回の資料の再掲 ・型パラメーターや変位指定、型境界でも同じことが言える ・便利だけど、最初は難しい ・ライブラリ作成時に使うと便利だけど、プロダクションコードで使う場合はチームのレベルに合わせよう 22
参考記事 ・[型パラメータと変位指定について調べたことをつらつら書いてく - Qiita](https://qiita.com/shou8/items/18cf79faa4fcc3e349c1) ・[Scala陰陽術! - Google スライ ド](https://docs.google.com/presentation/d/1H-cUi2GdBmFE8kBoaf6eogJU0IjafpN DLLaxu3C9CZw/present?slide=id.p)
・[型パラメータと変位指定 · Scala研修テキス ト](https://Scala-text.github.io/Scala_text/type-parameter.html) 23
• Future ◦ andThen ◦ recover, recoverWith ◦ result, ready
...etc 次回予告 24