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
160
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
86
digdagで支えるデータパイプライン / Building a data pipeline with digdag
yukiyan
1
5.7k
機械学習基盤を一人で構築するということ / 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
Catch Up: Go Style Guide Update
andpad
0
230
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
13
4.9k
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
600
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
3
900
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
1k
品質ワークショップをやってみた
nealle
0
510
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
200
技術的負債の正体を知って向き合う
irof
0
180
Building, Deploying, and Monitoring Ruby Web Applications with Falcon (Kaigi on Rails 2025)
ioquatix
4
2.2k
Foundation Modelsを実装日本語学習アプリを作ってみた!
hypebeans
0
120
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
930
株式会社 Sun terras カンパニーデック
sunterras
0
340
Featured
See All Featured
Bash Introduction
62gerente
615
210k
The Cult of Friendly URLs
andyhume
79
6.6k
Context Engineering - Making Every Token Count
addyosmani
7
260
Code Reviewing Like a Champion
maltzj
526
40k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Building Applications with DynamoDB
mza
96
6.7k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
460
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
Optimizing for Happiness
mojombo
379
70k
Balancing Empowerment & Direction
lara
5
690
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