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
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to Scala about type parameter
2020/08/04 社内LT
Scala 入門 Ⅱ
型パラメータ, 変位指定,
型境界, そして陰陽術へ...
Yukiyan
August 04, 2020
More Decks by Yukiyan
See All by Yukiyan
Introduction to Scala
yukiyan
0
100
digdagで支えるデータパイプライン / Building a data pipeline with digdag
yukiyan
1
5.9k
機械学習基盤を一人で構築するということ / 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
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
160
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.9k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
170
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
110
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
810
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
130
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
Contextとはなにか
chiroruxx
1
390
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
240
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
160
Docker and Python
trallard
47
3.9k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
180
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Design in an AI World
tapps
1
260
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
320
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Build your cross-platform service in a week with App Engine
jlugia
234
18k
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