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
330
型についてちょっと考える
主にHaskellとScalaの型クラスについて
t10471
November 03, 2017
Tweet
Share
More Decks by t10471
See All by t10471
hashicorp_raftからraftを学ぶ
t10471
0
1k
EOSにPull Requestを出してマージされた話
t10471
1
720
分散台帳・暗号通貨とRust ブロックチェーンをRustで作ってる話
t10471
2
1.5k
Kubernetesの ダークカナリアリリースツールを作った話
t10471
0
1.1k
Kubernetes・GCPを使った チャットボットサービスの 機械学習部分の話
t10471
0
180
Other Decks in Programming
See All in Programming
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
180
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
510
CSC307 Lecture 08
javiergs
PRO
0
670
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1k
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
250
CSC307 Lecture 03
javiergs
PRO
1
490
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
350
Oxlint JS plugins
kazupon
1
820
AtCoder Conference 2025
shindannin
0
1k
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
260
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
ぼくの開発環境2026
yuzneri
0
160
Featured
See All Featured
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
110
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
30 Presentation Tips
portentint
PRO
1
210
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
210
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
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は拡張関数
ありがとうございました