Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Relaxed Dependency Analysis

1.812 Aufrufe

Veröffentlicht am

Haskell 2009年末の集い、の発表資料。

Veröffentlicht in: Technologie
  • Loggen Sie sich ein, um Kommentare anzuzeigen.

  • Gehören Sie zu den Ersten, denen das gefällt!

Relaxed Dependency Analysis

  1. 1. Relaxed Dependency Analysis 〜Haskell 2009年末の集い〜 酒井 政裕
  2. 2. ⾃⼰紹介 酒井 政裕 • Blog: ヒビルテ • Twitter: @masahiro_sakai • 2001年末ごろにHaskellに遭遇 • 好きな関数: unfoldr
  3. 3. 背景: Haskellの型推論の流れ • 依存関係(の強連結成分)で定義をグループ化 • 末端のグループから順に型推論 • 例: 以下では b, c の型をまず推論し、その 結果を使って a の型を推論 –a=…b… a –b=…c… –c=…b… b c
  4. 4. Relaxed Dependency Analysis • 依存関係の定義の変更 – Haskell98では、aがbを参照していれば、 aはbに依存していた – Haskell2010では、bに型宣⾔がある場合には、 aがbを参照していても、依存とはみなさない • 効果 – より多相的な型を推論出来るようになる – これまで型宣⾔が必要だったのが、不要にな ることがある
  5. 5. 例: Haskell98の場合 • fとgは相互に依存してい f :: Eq a ⇒ a → Bool るので、同時に型推論 f x = (x == x) ∨ g True f g ∨ g “Yes” g y = (y ≤ y) ∨ f True • g が⼆通りの型で使われ ている – Bool → Bool – String → Bool • ⇒ 型エラー
  6. 6. 例: Haskell2010の場合 • fには型宣⾔があるので、 f :: Eq a ⇒ a → Bool gはfには依存しない f x = (x == x) ∨ g True ∨ g “Yes” f g × g y = (y ≤ y) ∨ f True • gを先に型推論して、 g :: ∀a. Ord a ⇒ a → Bool • fの型推論では、gの型変数 aをBoolとStringに具体化
  7. 7. 何が起こっているのか? • Haskellの基づいているHindley-Milnerのアルゴ リズムでは、ある定義グループの型推論の最後 の段階で型を多相的にする。 • なので、先に型推論が済んでいる部分は、型が 多相的な型になっているので、それを任意に具 体化出来る。 • ⼀⽅、型推論中の部分は、型が多相的になって いないので、複数の型で使うことが出来ない。

×