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
99
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
64
digdagで支えるデータパイプライン / Building a data pipeline with digdag
yukiyan
1
5.3k
機械学習基盤を一人で構築するということ / Hitori ml team
yukiyan
4
3.4k
ECSのデプロイツールを試している話
yukiyan
0
2.4k
Replace a batch application to ECS
yukiyan
1
1.5k
Introduction to Docker
yukiyan
0
5.7k
Other Decks in Programming
See All in Programming
Node.js v22 で変わること
yosuke_furukawa
PRO
9
3.2k
HUIT新歓2024「競技プログラミング、やってみませんか?」
slephy2784
1
270
2 週間で Twitter Bot を作ってみた
contour_gara
0
360
Anthropic Cookbook のおすすめレシピ
schroneko
7
930
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.7k
VS Code をプロダクトにどう取り込むか
onomax
1
360
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
23
15k
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
270
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
43
19k
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
690
Build Apps for iOS, Android & Desktop in 100% Kotlin With Compose Multiplatform (mDevCamp 2024)
zsmb
0
320
Tailwind CSSを本気でカスタマイズする方法
fsubal
13
5.2k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
274
13k
It's Worth the Effort
3n
180
27k
[RailsConf 2023] Rails as a piece of cake
palkan
23
3.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
19
1.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
125
32k
Optimizing for Happiness
mojombo
370
69k
A Philosophy of Restraint
colly
197
16k
10 Git Anti Patterns You Should be Aware of
lemiorhan
648
58k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
What's in a price? How to price your products and services
michaelherold
237
11k
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