Relaxed Dependency Analysis

1,673 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,673
On SlideShare
0
From Embeds
0
Number of Embeds
167
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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のアルゴ リズムでは、ある定義グループの型推論の最後 の段階で型を多相的にする。 • なので、先に型推論が済んでいる部分は、型が 多相的な型になっているので、それを任意に具 体化出来る。 • ⼀⽅、型推論中の部分は、型が多相的になって いないので、複数の型で使うことが出来ない。

×