← カタログへ戻る #183

HM型推論

型変数の単一化を手で解いて多相型を推論する

背景: Hindley-Milner 型推論は 制約生成Robinson単一化let多相化 の3段階。各部分式に新しい型変数 α, β, ... を割り当て、関数適用 e₁ e₂ から type(e₁) = type(e₂) → α という制約を生成。Robinson のアルゴリズムで全制約を満たす最汎単一子 (mgu) を求める。
STAGE: 1/5 制約残: 0 解決: 0 失敗: 0

プログラム

期待される推論結果

制約 (Constraints)

    代入 (Substitution σ)

    Hindley-Milner

    下のリストから制約を1つ選び、Unify ボタンを押すと Robinson 単一化を1ステップ実行。
    全制約を解いて最終型を得ればクリア。

    ヒント: 型変数 α と具体型 Int の単一化は α↦Int を代入に追加。fn(a→b) と fn(c→d) の単一化は a=c, b=d の2制約に分解。

    操作

    制約をクリック 選択 UNIFY 選択中の制約を1ステップ単一化 AUTO 残り全制約を自動解決 HINT 次に解くべき制約を点滅 RESET やり直し

    Robinson 単一化規則:
    α = α → 削除  α = τ (αが τ に出現しない) → α↦τ を σ に追加し、残り制約に適用
    τ = α → 上と同様  c = c (基本型) → 削除  τ₁ → τ₂ = σ₁ → σ₂ → τ₁=σ₁, τ₂=σ₂ に分解
    c = c' (異なる基本型) または α = τ with α ∈ FV(τ) → 失敗 (occurs check)

    Y Lab tieup: ML系 (OCaml/Haskell) の型推論の根幹。横山研の関数型・可逆型システム研究 (R-WHILE/Janus) で型を扱う前提知識として頻出。