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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
180
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.4k
20260315 AWSなんもわからん🥲
chiilog
2
170
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
460
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
330
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
160
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
1.1k
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
170
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
640
Ruby and LLM Ecosystem 2nd
koic
1
1.3k
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1.1k
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
A designer walks into a library…
pauljervisheath
210
24k
Git: the NoSQL Database
bkeepers
PRO
432
67k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
200
Claude Code のすすめ
schroneko
67
220k
Test your architecture with Archunit
thirion
1
2.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
110
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
150
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
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