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
290
型についてちょっと考える
主にHaskellとScalaの型クラスについて
t10471
November 03, 2017
Tweet
Share
More Decks by t10471
See All by t10471
hashicorp_raftからraftを学ぶ
t10471
0
680
EOSにPull Requestを出してマージされた話
t10471
1
650
分散台帳・暗号通貨とRust ブロックチェーンをRustで作ってる話
t10471
2
1.3k
Kubernetesの ダークカナリアリリースツールを作った話
t10471
0
610
Kubernetes・GCPを使った チャットボットサービスの 機械学習部分の話
t10471
0
150
Other Decks in Programming
See All in Programming
Java 22 Overview
kishida
1
180
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
160
Ruby Function Composition
bkuhlmann
1
330
新宿ダンジョンを可視化してみた
satoshi7190
2
210
見た目から始める生産性向上
ikumatadokoro
7
760
[技育CAMPアカデミア]アイディアを形に!【超入門】スマホアプリ開発〜リリースまでの流れをご紹介
teamlab
PRO
0
350
Rubyでたのしむクリエイティブコーディング/Enjoy Creative coding with Ruby
chobishiba
1
170
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
220
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
Goのmultiple errorsについて (2024年4月版)
syumai
1
330
コーンフレークから始める モデリング会話入門
ogurotakayuki
0
340
Micro Frontends for Java Microservices - Devnexus 2024
mraible
PRO
0
470
Featured
See All Featured
Music & Morning Musume
bryan
41
5.6k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Thoughts on Productivity
jonyablonski
57
3.8k
4 Signs Your Business is Dying
shpigford
175
21k
The World Runs on Bad Software
bkeepers
PRO
61
6.7k
How to Ace a Technical Interview
jacobian
272
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
240
1.2M
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
15
2.6k
Debugging Ruby Performance
tmm1
70
11k
Building Your Own Lightsaber
phodgson
98
5.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
16
6.4k
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は拡張関数
ありがとうございました