コンパイラ – 原理と構造 – 補足説明
コンパイラ – 原理と構造 – 補足説明

第 6 章 型の解析と型推論

型代入の考え方

6.5.3項での説明の通り,型推論アルゴリズム𝒲は 与えられた型環境Γと式eを受け取り, 型τと型代入Sの組を返す

𝒲(Γ,e)=(S,τ)

の形の関数である. この𝒲の内部構造を理解し,さらに,新たな式の定義を考える 上での鍵は,型代入Sの役割の理解にある. 型代入が複数でてきて分かりにくいと思えたら,

型代入の作成は,型の制約が成り立つ「新しい世界」を作る操作

と考えるてみよう. 前の世界の型τや型環境Γは,新しい世界ではS(τ)および S(Γ)となる. この考え方の下では,関数適用のケース

𝒲(Γ,e1e2)=
   let (S1,τ1)=𝒲(Γ,e1)
        (S2,τ2)=𝒲(S1(Γ),e2)
        S3=𝒰({(S2(τ1),τ2t)})   (t fresh)
   in (S3S2S1,S3(t))

は以下の計算を行っている,と理解できる.

  1. 1.

    e1 e2の制約解消されていない世界のΓが与えられている.

  2. 2.

    e1の制約を満たす世界を表す型代入S1とその世界でのΓつまり (S1(Γ))の下でのeの型τ1を求める.

    (S1,τ1)=𝒲(Γ,e1)
  3. 3.

    さらに,e2の制約を満たす新しい世界を表すS2と, その世界での型環境S1(Γ)の下でのe2の型τ2を求める.

    (S2,τ2)=𝒲(S1(Γ),e2)
  4. 4.

    この世界で,e1e2の型を表す新しい型変数tを作る. この世界では,τ1S2(τ1)であるから, 型規則が要求する等式は

    S2(τ1)=τ2t

    である. この等式を満たす世界を表す型代入S3を求める.

    S3=𝒰({(S2(τ1),τ2t)})

    この新しい世界ではtS3(t)である.

  5. 5.

    最初に与えられた世界の型をこの世界に送る 型代入はS3S2S1であるから,返すべき値は (S3S2S1,S3(t))である.

この考え方を会得すれば,種々の新しい構文に対する型推論手順を 書くことができるはずである. 例として,7.3節で解説するfix式の型規則
    (fix)   Γ{f:τ1τ2,x:τ1}e:τ2 Γfix f(x) => e:τ1τ2
の定義を書いてみよう. 考え方を以下の通りである.

  1. 1.

    fix f(x) => eの制約が解消されていない世界の Γが与えられている.

  2. 2.

    fxの型を表現するために,この世界で新しい型変数t1t2を作成し, eの制約を満たす世界を表すS1と,その世界での型環境Γ{f:t1t2,x:t1}の 下でのeの型τを求める.

    (S1,τ)=𝒲(Γ{f:t1t2,x:t1},e)
  3. 3.

    この新しい世界では,t2S1(t2)であるから,型規則の制約を表す等式は

    S1(t2)=τ

    である. この等式を満たす世界を表す型代入S2を求める.

    S2=𝒰({(S(t2),τ)})
  4. 4.

    この世界では,t1t2S2S1(t1t2)であり,もとの世界を この世界に移す代入はS2S1であるから,求める解は

    (S2S1,S2S1(t1t2))

    である.

以上から,𝒲の定義は,

𝒲(Γ,fix f(x) => e)=
   let (S1,τ)=𝒲(Γ{f:t1t2,x:t1},e)  (t1, t2 fresh)
         S2=𝒰({(S1(t2),τ)})
   in (S2S1,S2S1(t1t2))

となる.