型推論
型を明示的に記述しなくても、言語処理系が文脈から主要型を推論する機構
推論に失敗するとその時点でエラーを報告できるので、誤った型を用いることに依るバグは回避できる
#WIP
定式化
型環境$ \Gammaと、式$ eから、
$ S\Gamma\vdash e:\tauを満たすような型代入$ Sと型$ \tauを求める
のが、型推論
CoPL#5ebd00e21982700000bcb082
型推論器の持つべき性質
健全性
型推論できたプログラムは必ず型検査を通過する
型が推論できるなら、そのプログラムは正しい
比較的容易
完全性
型宣言をした場合に型検査に通過するようなプログラムは、すべての型宣言を省略した場合でも主要型の型推論に成功する
MLの型推論機は健全かつ完全である
型推論の手順 ref
コード中の未知の型変数を文脈に追加
推論規則を用いて型の等値成約を生成
得られた成約列を単一化して、文脈に追加した型変数を消す
最も汎用的な型を求めて元々辞書に書いてあった型を更新するってこと?
ちがうか、型変数を消して型を特定するってことか
型の連立方程式を求める
文脈を更新して、次に進む
以下の記事を見たらだいたい分かる
A brief introduction to type inference - Speaker Deck
用語
文脈
変数、関数名と、その型の辞書
推論規則
成約を生成するルール
型の等値成約
型変数同士の等式
一度は異なる型変数をおいたが、推論の過程で同じものだとわかったときに、一致させて片方の型変数を消す
ref
型推論の歴史 ref
単純型付きラムダ計算
Lispは動的型付きの言語だが、大きなプログラムを維持するとなると静的検査が必要になった
型を付与する上で問題になったのが以下の2つ
ポリモーフィズムをどう扱うか
特にLispはリストを扱うことがとても多いので。
型推論をどうするか
ポリモーフィズムありで型推論がないと、型を明示する際にめっちゃ煩雑になるので辛い
1970年前後にHindley-Milner 型システムが登場
成約単一化型推論
弱点
https://speakerdeck.com/cannorin/a-brief-introduction-to-type-inference?slide=38
TypeScriptの型推論
https://qiita.com/uhyo/items/6acb7f4ee73287d5dac0
参考
CoPL 10章
JEP 286 を調べていたはずなのにいつのまにか Kotlin で Hindley-Milner 型推論を実装していた - Qiita
型推論のしくみ : KLabGames Tech Blog
型推論について - soutaroブログ
https://keens.github.io/blog/2019/12/08/tetsuzukigatanoudekatasuironwojissoushitemita/
手続き的に型推論器を実装する
https://qiita.com/mod_poppo/items/de3ef7965197dbbda761
https://openreview.net/forum?id=Hkx6hANtwH
Neural Networkを使った漸進的型付けに対する型推論
https://twitter.com/bd_gfngfn/status/1242724328522665984
https://sumii.hatenablog.com/entry/20051018/1129631080
https://www.wantedly.com/companies/wantedly/post_articles/349494