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
型についてちょっと考える
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
t10471
November 03, 2017
Programming
340
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
型についてちょっと考える
主にHaskellとScalaの型クラスについて
t10471
November 03, 2017
More Decks by t10471
See All by t10471
hashicorp_raftからraftを学ぶ
t10471
0
1k
EOSにPull Requestを出してマージされた話
t10471
1
730
分散台帳・暗号通貨とRust ブロックチェーンをRustで作ってる話
t10471
2
1.5k
Kubernetesの ダークカナリアリリースツールを作った話
t10471
0
1.1k
Kubernetes・GCPを使った チャットボットサービスの 機械学習部分の話
t10471
0
190
Other Decks in Programming
See All in Programming
Modding RubyKaigi for Myself
yui_knk
0
900
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
310
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
110
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
260
Claspは野良GASの夢をみるか
takter00
0
170
LLM Plugin for Node-REDの利用方法と開発について
404background
0
160
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.9k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
110
AIで効率化できた業務・日常
ochtum
0
110
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.2k
Featured
See All Featured
New Earth Scene 8
popppiees
3
2.3k
Optimizing for Happiness
mojombo
378
71k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
380
How to Ace a Technical Interview
jacobian
281
24k
What's in a price? How to price your products and services
michaelherold
247
13k
Building Applications with DynamoDB
mza
96
7.1k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Making Projects Easy
brettharned
120
6.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Designing for humans not robots
tammielis
254
26k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Transcript
型についてちょっと考えてみる ✤ 社内勉強会 ✤ @t10471
自己紹介 ✤ 所属 ✤ CyberAgent ✤ AI Messenger ✤ Haskellが好き
✤ 業務はScalaとPython ✤ 普段使っているもの ✤ tumx ✤ fish ✤ vim ✤ IntelliJ IDEA
注意 ✤ 間違っているところがあるかもしれません ✤ ご勘弁ください ✤ サンプルコードは色んなところからとってきてます ✤ すみません。色々なところから拝借したので具体的 なところは忘れてしまいました
型って? ✤ 「値の種類」のこと ✤ 整数型、文字列型とか ✤ 言語によって色々違ったりするかも? ✤ Javaのクラスとかは自分で定義した型
型の種類 ✤ プリミティブ型(値型) ✤ JavaやC#,Haskell(GHC)の場合,boolean, int, float, charなど ✤ ポインタに乗ってないやつ(スタック)
✤ 言語によって違うかも? ✤ 参照型 ✤ 自分で定義した型とかクラスの型 ✤ ポインタに乗っているやつ(ヒープ)
型といえはポリモーフィズム(多 相) ✤ 型をつけることによってコンパイル時にエラーをチェッ クして欲しい ✤ でも、いろんな型を一緒に扱いたい時もある ✤ メジャーな例は継承 ✤
最近は継承は良くない的な雰囲気もある…
多相性(ポリモーフィズム) ✤ いろんな多相がある ✤ アドホック多相 ✤ 派生型 (部分型付け, レコード多相とか) ✤
パラメータ多相 (高階多相) ✤ ランクN多相
アドホック多相 ✤ 有名どころはJavaのオーバーロード ✤ 引数の型の違いで同じ関数名を定義できる ✤ Common Lisp Object Systemでは総称関数(後で効いて
くる) Common Lisp Object System
派生型(subtype) ✤ 基本型(SuperType)に対して派生した型のことを Subtype という ✤ 2つのタイプがある ✤ Nominal Subtyping
(公称型) ✤ Structural Subtyping (構造的部分型)
Nominal Subtyping ✤ JavaやC#で明示的にinterfaceの実装、classの継承を して自らの型を公称する Java
Structural Subtyping ✤ 自らの型を公称しなくても構造的に一致するのであれば、派生型として認識す る ✤ Go、TypeScript、Scala等で持っている。OCamlはOOPだけどこっち ✤ Haskell (GHC)もExistentialQuantification拡張でいける(存在量化された型)
Go
レコード多相(列多相ともいう?) SML# OCaml Structural Subtypingのデータ版?
OOPのポリモーフィズムの種類 ✤ 載せたけど、ここはちょっと強引… ✤ クラスベース ✤ 継承でポリモーフィズムを表現する ✤ Java,C++など ✤
プロトタイプベース ✤ プロトタイプチェーンを遡っていくことでポリモー フィズムを表現できる ✤ JavaScript
パラメータ多相 ✤ いわゆるジェネリックプログラミングというやつ C++
高階多相 ✤ パラメータ多相が高階(higher order)になったやつ ✤ Scala, Haskell, C++(?)とかにある ✤ OCamlを含むML系言語はない(多分…)
✤ TypeScriptとかRustにはない
Scalaの場合 Haskellの場合
高階多相がない言語で頑張る場合 TypeScript
別の言語 Rust
ランクN多相 ✤ の前に型推論の話をしないといけない… ✤ 難しいのでちょっとだけ ✤ ナイーブな型推論はHindley-Milner ✤ 1階の型推論だけしかできないけど決定可能 ✤
OCamlとScala(2系)はHindley-Milnerの拡張らしい ✤ System F(ωがつくのもある) ✤ 多相ラムダ計算ができるけど決定不能な場合がある ✤ Haskell(GHC)はこっち、Scala(Dotty)はこれの発展 系
ランクN多相(Haskell)
Scalaはランク1多相
ランクN多相をScalaでやる場合
型クラス ✤ オブジェクト指向の言語は継承やオーバーロードで同 じ名前の関数の解決ができる ✤ 関数型言語はオブジェクトがないから引数でしか決定 できない… ✤ CLOSの総称関数はあるけど、CLOSは動的型付け言語…
そこで型クラスの登場
Scalaだと
Scalaで型クラスの何が嬉しいの? ✤ Javaだと人が作ったクラスをいじれないけど ✤ 型クラスを使うと拡張できる ✤ JavaだとよくWrapper Classを使って対応してた
型クラスの流行り ✤ RustとかSwiftも取り入れている ✤ kotlinは拡張関数
ありがとうございました