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
350
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
1.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
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
320
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.7k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
130
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.7k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
810
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
210
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
430
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
940
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
330
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
180
自作OSでスライド発表する
uyuki234
1
3.5k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Paper Plane (Part 1)
katiecoart
PRO
0
9.4k
The agentic SEO stack - context over prompts
schlessera
0
840
The Curious Case for Waylosing
cassininazir
1
420
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
HDC tutorial
michielstock
2
730
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
650
How to Think Like a Performance Engineer
csswizardry
28
2.7k
The Curse of the Amulet
leimatthew05
2
13k
Believing is Seeing
oripsolob
1
160
Code Reviewing Like a Champion
maltzj
528
40k
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は拡張関数
ありがとうございました