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
xorphitus
June 16, 2016
Programming
0
55
型システムを学ぼうとした結果
名著と呼ばれる「型システム入門」を読もうとしました。
xorphitus
June 16, 2016
Tweet
Share
More Decks by xorphitus
See All by xorphitus
オリジナリティのあるGitLabを標準に近づける
xorphitus
1
650
マイクロサービスを作ろう
xorphitus
0
140
コンテナ起動への道
xorphitus
0
140
M-x doctor
xorphitus
0
120
型で数を表そう
xorphitus
0
90
AOT と direct linking
xorphitus
0
72
CFS入門
xorphitus
0
71
HyperLogLog
xorphitus
0
85
immutable database
xorphitus
0
250
Other Decks in Programming
See All in Programming
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
110
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
300
Recoilを剥がしている話
kirik
5
6.6k
CSC305 Lecture 25
javiergs
PRO
0
130
MCP with Cloudflare Workers
yusukebe
2
220
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
710
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
130
あれやってみてー駆動から成長を加速させる / areyattemite-driven
nashiusagi
1
200
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
360
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
Featured
See All Featured
Scaling GitHub
holman
458
140k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
GraphQLとの向き合い方2022年版
quramy
44
13k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
A Philosophy of Restraint
colly
203
16k
Automating Front-end Workflow
addyosmani
1366
200k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
We Have a Design System, Now What?
morganepeng
51
7.3k
Side Projects
sachag
452
42k
GitHub's CSS Performance
jonrohan
1030
460k
Transcript
型システムを 学ぼうとした結果 @xorphitus (2016-06)
型と言えば?
型システム 入門失格
型システム 入門失格
入門失格
System F lambda cube 単純型付 λ計算 いまここ
道のり長すぎ 無理、読むの疲れた ってか時間足りん
はい、では開き直って 型付きλ計算の話しまーす
そもそも型とは? OOPやFPが多義的であるように、型というのも多義的であるように思う が、TaPLの最初の方でそうした事象も包括して以下のように述べられている > 型システムとはプログラムの各部分を > それが計算する種類の値に沿って分類することにより > プログラムがある種の振る舞いを起こさないことを保証する >
計算量的に扱いやすい構文的手法である 例えば、λ計算は型なんかなくてもチューリング完全である そのことからも分かるように、計算能力と型とは直行する概念なのだと思う
まずは、型なしλ計算を拡張するところから 型の前に。 • そもそも、なぜλ計算? ◦ それ自体がプログラミング言語として振る舞える ◦ 数学モデルであるため、計算に対する証明を数学的に行える ◦ →
CTMCPで言うところの核言語としてうってつけ • どう拡張するの? ◦ ブール値と自然数のプリミティブを導入する ◦ だって全部チャーチ数とかで表したら大変じゃん! ◦ これらは、チャーチブール値、チャーチ数と相互に変換可能
プリミティブを導入したはいいけど こういう妙な関数適用が作れちゃう succ true 計算ルール上は簡約可能でありながら、 後者関数はブール値に対して未定義なため、簡約がストップする (「行き詰まり状態」と呼ばれる) 型とは、こうした行き詰まり状態を回避し、計算の安全性を担保する仕組み …というのがどの言語でも最低限共通する部分と思われる 言われなくてもみんな経験的に知っているようなものでもある
λ計算に型を導入する まずは単なる記法のルールから : に続けて型を書くというのと、関数の型は右アローで書く λx:T x : T→T まあ直感的に分かる さらに、型環境Γ(各自由変数がどんな型を持つか)を導入すると
Γ⊢y:T2 λx:T1 y : T1→T2 eval/applyでevalに渡す環境と似たようなもんか
なぜ型付けされると行き詰まり状態にならないのか 最初の話に戻り、例えば succ true のような項は未定義であるため簡約できずに計算が行き詰まる ということで、それを回避するために型の話が出てきた 正しく型付けされていればこのような項は発生しない 直感的にそれは分かるのだが…なぜか?
行き詰まり状態を回避できる理由 それは進行、保存という2つの定理より導出される 分かりやすさのため、少々砕けた表現で記述すると • 進行定理 ◦ tが正しく型付けされた項であるならば、 tは値であるか簡約が可能である • 保存定理
◦ t:Tの時、tを簡約した項t’の型も同じくTとなる これらより tが正しく型付けされているのであれば値になるまで簡約が可能と言える (なお、両定理とも帰納法で証明が可能である)
折角なので型検査を実装してみようとした TaPL本では、OCamlによる実装例がちょいちょい入っている。 曰く > (これを実装するプログラミング言語についての)最も重要な要求は > 自動メモリ管理と、構造データ型に対するパターンマッチを用いて > 再帰関数を容易に定義できる機能である ※注釈では「好みは様々だしどの言語でもできるけど、手動メモリ管理はダルい」とも言っている
というわけで、学習も兼ねてHaskellで作ってみることにしたが、間に合わず https://gist.github.com/xorphitus/cba339951a4aab83cf0ca4f8f9f799d8
最後に 辛かった。 とりあえずSystem Fまではたどり着きたい。 ML、Haskellの基盤となる論理らしいので。 あと、型システムに入門できないと、タイトルが太宰治っぽくなる。