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
63
型システムを学ぼうとした結果
名著と呼ばれる「型システム入門」を読もうとしました。
xorphitus
June 16, 2016
Tweet
Share
More Decks by xorphitus
See All by xorphitus
オリジナリティのあるGitLabを標準に近づける
xorphitus
1
700
マイクロサービスを作ろう
xorphitus
0
150
コンテナ起動への道
xorphitus
0
150
M-x doctor
xorphitus
0
140
型で数を表そう
xorphitus
0
93
AOT と direct linking
xorphitus
0
76
CFS入門
xorphitus
0
75
HyperLogLog
xorphitus
0
92
immutable database
xorphitus
0
290
Other Decks in Programming
See All in Programming
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
4
1.5k
CSC305 Summer Lecture 12
javiergs
PRO
0
130
More Approvers for Greater OSS and Japan Community
tkikuc
1
100
パスタの技術
yusukebe
1
550
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
7
1k
オープンセミナー2025@広島LT技術ブログを続けるには
satoshi256kbyte
0
150
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
1
270
DockerからECSへ 〜 AWSの海に出る前に知っておきたいこと 〜
ota1022
5
1.9k
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
3
320
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
130
Azure SRE Agentで運用は楽になるのか?
kkamegawa
0
930
パッケージ設計の黒魔術/Kyoto.go#63
lufia
3
390
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
55
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The Language of Interfaces
destraynor
160
25k
Typedesign – Prime Four
hannesfritz
42
2.8k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6.1k
Into the Great Unknown - MozCon
thekraken
40
2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Automating Front-end Workflow
addyosmani
1370
200k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
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の基盤となる論理らしいので。 あと、型システムに入門できないと、タイトルが太宰治っぽくなる。