おれが

Hindley-Milnerだ!!!

注意

前提知識多め

型推論:式から型を推測する

Hindley-Milner型システム

HindleyとMilnerが独立に発見

うまく式に型をつけられる

しかもつけた型は最も一般的

なものになる

要約

すごい!!!

How it works

式の形見れば大体型が分かる

分からんところは変数にしておく

後で変数の制約が分かるから

それを適用する

How it works

λx. y

How it works

λx. y

とりあえずx: αとおく

How it works

λx. y

{x: α}という情報から,

yの型を推論する

How it works

λx. x+1

{x: α}で,(+)の引数はIntなのでαはInt

(+)の結果はIntなのでx+1の型はInt

のとき

後でやる型推論から

既に導入した型変数の値が分かる!!!

推論関数inferは

変数名→型,式)→

型変数→型,型)

という型を持つ

推論関数inferは

({x: α},x+1)→

({α:Int},Int)

という値を持つ

How it works

λx. x+1

{x: α}で,(+)の引数はIntなのでαはInt

(+)の結果はIntなのでx+1の型はInt

のとき

How it works

λx. x+1

のとき

Int

α

α→Int

⇒{α: Int}を代入して,Int→Int

How it works

λx. x

のとき

α

αα

注意: αは特定の具象型(∀αではない)

α

How it works

let id = λx. x

αα

ここで一般化(generalize)

αにはどんな型を入れてもよいので,

{id: ∀α. αα}とする

しゃべったこと

  • 分からない型は変数でおいて続ける
  • 後で型の制約が分かったら代入(substitute)する
  • 名前に値を束縛するときに一般化(generalize)する

しゃべら(れ)なかったこと

  • 同じ型について別々の推論結果が出たときは単一化(unify)する
  • 実は∀α. α→αは型ではなくスキームであり,名前はスキームを持つが値はスキームを持たない(型を持つ)
  • スキームから型を取り出すことを実体化(instantiate)と呼ぶ

Hindley-Milner

By pandaman64

Hindley-Milner

  • 735