Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

A brief introduction to type inference

A brief introduction to type inference

We present a brief introduction to what "type inference" is and how it works, in 5 minutes! This talk will take place in VRCLT #2. Please visit their website https://vrc-lt.github.io/ for more information.

Avatar for cannorin

cannorin

June 14, 2019
Tweet

More Decks by cannorin

Other Decks in Programming

Transcript

  1. 3 / 42 䞍毛な型掚論バトル • C#/Java の var みたいなや぀でしょ •

    Python も型曞かなくおいいじゃん • そんな最近出おきた機胜知らない
  2. 4 / 42 䞍毛な型掚論バトル ←こわい • C#/Java の var みたいなや぀でしょ

    → あい぀らはク゜ザコ • Python も型曞かなくおいいじゃん → 動的型付けず䞀緒にするな • そんな最近出おきた機胜知らない → 昔からあるし
  3. 6 / 42 なぜ繰り返されるのか • 型掚論ずは䞀䜓なんなのか理解されおいない 動的型付けずの違いがわからない • 型掚論の仕組みが知られおない 

    C#/Java の var ずの違いがわからない • わからないものは怖がられがち 䞀般にアカデミアの人間は怖がられがち
  4. 10 / 42 1 型掚論っおそもそも䜕 • 䞻に静的型付き蚀語をタヌゲットずする • 倉数・関数の型がほずんど or

    党く曞かれおいない コヌドに • もっずも汎甚的な正しい型を圓おはめる手法
  5. 11 / 42 1.1 芁するに let-function add_two (x : int)

    : int = + x 2 let-function apply_twice (f : int → int) (x : int) : int = f (f x) let-value foo : int = apply_twice add_two 0 もずもずはこういう蚀語
  6. 12 / 42 1.1 芁するに let-function add_two (x : int)

    : int = + x 2 let-function apply_twice (f : int → int) (x : int) : int = f (f x) let-value foo : int = apply_twice add_two 0 プログラマが型を曞かなくおも
  7. 13 / 42 1.1 芁するに let-function add_two (x : int)

    : int = + x 2 let-function apply_twice (f : int → int) (x : int) : int = f (f x) let-value foo : int = (←C#/Java はここしかできない ) apply_twice add_two 0 自動で最適な型を぀けおくれる
  8. 14 / 42 1.2 型掚論の特長 • 䞻に静的型付き蚀語をタヌゲットずする • 倉数・関数の型がほずんど or

    党く曞かれおいない コヌドに • もっずも汎甚的な正しい型を圓おはめる手法
  9. 15 / 42 1.2 型掚論の特長 • 䞻に静的型付き蚀語をタヌゲットずする → 厳栌な型チェックによる利点はそのたた •

    倉数・関数の型がほずんど or 党く曞かれおいない コヌドに → 耇雑な型になるコヌドでも簡単に曞ける • もっずも汎甚的な正しい型を圓おはめる手法 → 倱敗しないし信頌できるように䜜る必芁がある
  10. 16 / 42 1.3 型掚論の短所 • コンパむル時間が長くなる • 蚀語の型システムの機胜が匷すぎるず無理 •

    動的型付けず芋た目は䌌おるが動的型付き蚀語に あずから远加するのは倧倉難しい
  11. 17 / 42 1.3 型掚論の短所 • コンパむル時間が長くなる そのぶん動䜜は高速だしバグも枛らせるけど • 蚀語の型システムの機胜が匷すぎるず無理

    理論的限界䞀郚だけ曞かせるずできたりする • 動的型付けず芋た目は䌌おるが動的型付き蚀語に あずから远加するのは倧倉難しい そもそもベヌスが静的型付けなので  
  12. 20 / 42 2 型掚論の仕組み • 文脈倉数・関数名ずその型の蟞曞ず 掚論芏則制玄を生成するルヌルを甚意する • コヌド䞭の未知の型倉数を文脈に远加し掚論芏則

    を甚いお型の等倀制玄≒型の等匏を生成する • 埗られた制玄列を単䞀化しお文脈に远加した 型倉数を消す≒型の連立方皋匏の解を求める
  13. 21 / 42 2 型掚論の仕組み • 文脈倉数・関数名ずその型の蟞曞ず 掚論芏則制玄を生成するルヌルを甚意する • コヌド䞭の未知の型倉数を文脈に远加し掚論芏則

    を甚いお型の等倀制玄≒型の等匏を生成する • 埗られた制玄列を単䞀化しお文脈に远加した 型倉数を消す≒型の連立方皋匏の解を求める • 必芁な結果を文脈に残しお次のコヌドに進む
  14. 22 / 42 2.1 実際にやっおみよう • 文脈倉数・関数名ずその型の蟞曞ず 掚論芏則制玄を生成するルヌルを甚意する – 文脈

    • + は int 型 2 ぀を取っお int 型を返す ( +: int → int → int ) – 掚論芏則 • 敎数リテラル 0,1,2... は int 型 • 文脈に関数 f: a → b, 倀 x: a があるずき 関数適甚 f x は b 型 • etc...
  15. 23 / 42 2.1 実際にやっおみよう • コヌド䞭の未知の型倉数を文脈に远加し掚論芏則 を甚いお型の等倀制玄≒型の等匏を生成する let-function add_two

    x = + x 2 制玄 文脈 + : int → int → int ※ 未知の関数・倉数に察しお他ず重耇 しないように型倉数を生成し文脈に远加する
  16. 24 / 42 2.1 実際にやっおみよう • コヌド䞭の未知の型倉数を文脈に远加し掚論芏則 を甚いお型の等倀制玄≒型の等匏を生成する let-function add_two

    x = + x 2 制玄 文脈 + : int → int → int, add_two : a → b ※ 未知の関数・倉数に察しお他ず重耇 しないように型倉数を生成し文脈に远加する
  17. 25 / 42 2.1 実際にやっおみよう • コヌド䞭の未知の型倉数を文脈に远加し掚論芏則 を甚いお型の等倀制玄≒型の等匏を生成する let-function add_two

    x = + x 2 制玄 文脈 + : int → int → int, add_two : a → b, x : c ※ 未知の関数・倉数に察しお他ず重耇 しないように型倉数を生成し文脈に远加する
  18. 36 / 42 2.2 Hindley-Milner 型掚論 • 䟋えば は関数 f

    がどんな型であっおも䜿えるはず • このような関数に察しお自動的に党称型を付ける ゞェネリック型にするように蚭蚈された アルゎリ ズムが Hindley-Milner 型掚論 • 䞭身は先ほど説明した仕組みずほが同じで党称型付 きの関数を文脈に蚘録する際に工倫をする let-function apply_twice f x = f (f x)
  19. 37 / 42 2.2 Hindley-Milner 型掚論 • Hindley-Milner を䜿うず先述の䟋には ずいう型を぀けるこずができる

    • Hindley-Milner の歎史は叀くだいたい 1970 幎代た で遡るこずができる • たずもな型掚論を積んでいる珟代の蚀語はほが 䟋倖 なく Hindley-Milner かその拡匵を䜿っおいる let-function apply_twice<T> (f : T → T) (x : T) : T = f (f x)
  20. 38 / 42 2.3 制玄単䞀化型掚論の限界 • 型の等倀制玄を単䞀化するタむプの型掚論アルゎリズ ムは関数・挔算子のオヌバヌロヌドに察応できない – 解が耇数存圚するが党称型にならないので

    「䞀番汎甚的な型」がそもそも存圚しない – ナヌザが自䜜型に挔算子を定矩できるような堎合 解がいく぀あるのかすら分からない – Hindley-Milner にオヌバヌロヌド解決を加えるず 決定䞍胜になる止たらないかもしれない
  21. 39 / 42 2.3 制玄単䞀化型掚論の限界 • ほが同じ理由でオブゞェクト指向プログラミングで よく䜿われる機胜ぞの察応が難しい – 同じ名前のメンバやメ゜ッドを持぀型がたくさん存

    圚しうるのでそれらの䜿い方から解が定たらない – 継承などの機胜で郚分型が導入されるず掚論結果 の汎甚性に郚分型関係が絡んできお難しい – 型の解がいく぀あるのか分からなくなるような機胜 はだいたいダバむ
  22. 40 / 42 2.4 Further Reading • LT の枠に収めるために端折ったり誀魔化したりした 所が結構ある  

    特に型掚論の限界はもっず色々ある • 興味があっお詳しく知りたい・実装しおみたい方は B. C. Pierce 「型システム入門」を読んでみおね↓ • prog-lang-sys-ja.slack.com の #theory チャンネルに来おもらえれば蟌み入った 質問にも随時察応できたすので是非〜