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
t10471
November 03, 2017
Programming
1
300
型についてちょっと考える
主にHaskellとScalaの型クラスについて
t10471
November 03, 2017
Tweet
Share
More Decks by t10471
See All by t10471
hashicorp_raftからraftを学ぶ
t10471
0
870
EOSにPull Requestを出してマージされた話
t10471
1
680
分散台帳・暗号通貨とRust ブロックチェーンをRustで作ってる話
t10471
2
1.4k
Kubernetesの ダークカナリアリリースツールを作った話
t10471
0
800
Kubernetes・GCPを使った チャットボットサービスの 機械学習部分の話
t10471
0
160
Other Decks in Programming
See All in Programming
Security_for_introducing_eBPF
kentatada
0
110
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
6
1.1k
Amazon S3 NYJavaSIG 2024-12-12
sullis
0
100
ドメインイベント増えすぎ問題
h0r15h0
2
330
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
250
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.7k
CSC305 Lecture 26
javiergs
PRO
0
140
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
420
Featured
See All Featured
Fireside Chat
paigeccino
34
3.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Done Done
chrislema
181
16k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Docker and Python
trallard
42
3.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
BBQ
matthewcrist
85
9.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
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は拡張関数
ありがとうございました