GADTをつくろう
びず@wasabiz
自己紹介
• Yuichi Nishiwaki
• @wasabiz
• 大学生です(やさしくしてね)
• DeNAでJSXという言語をつくったり趣味で
schemeのJITコンパイラつくったり
GADTをつくろう
今日のおはなし
• HaskellのGADTの話
びず@wasabiz
GADTをつくろう
今日のおはなし
• HaskellのGADTの話
• GADTの実用(いつ使うか・どこで使うか)
びず@wasabiz
GADTをつくろう
今日のおはなし
• HaskellのGADTの話
• GADTの実用(いつ使うか・どこで使うか)
びず@wasabiz
という話はしません
GADTをつくろう
!
• HaskellのGADTの話
• GADTの実用(いつ使うか・どこで使うか)
びず@wasabiz
↑の話に期待した人
はい残念でしたー
GADTをつくろう
今日のおはなし
☓ GADTの使い方
○ GADTの作り方
◎ GADTのサポートがない言語でGADTをエ
ミュレートする
びず@wasabiz
GADTをつくろう
今日のおはなし
☓ GADTの使い方
○ GADTの作り方
◎ GADTのサポートがない言語でGADTをエ
ミュレートする
びず@wasabiz
GADTをつくろう
今日のおはなし
☓ GADTの使い方
○ GADTの作り方
◎ GADTのサポートがない言語でGADTをエ
ミュレートする
びず@wasabiz
GADTをつくろう びず@wasabiz
GADTとは
データコンストラクタの型を指定できる凄い奴
GADTをつくろう びず@wasabiz
GADTの理論的背景
• HM = (restricted) System F
• GADT = System F + type-equality proof
System F
型の等しさが判定できればGADTが作れる!
{-# LANGUAGE GADTs #-}なしで
( ) 。o(待てよ、型の等しさってどうやって判定するんだ…?)
¦Google検索¦ ┗(☋` )┓三
( ◠◠ )☛ Data.Type.Equality - Hackage
( ^o^) 超かんたんじゃん!これ使えば一発wでもどうやって実装し
   てるんだろう…?
¦ソースコード¦ ┗(☋` )┓三
( ◠◠ )☛ {-# LANGUAGE GADTs #-}
▂▅▇█▓▒░( ω )░▒▓█▇▅▂
うわああああああああ
_人人人人人人人人人人_

> 卵が先か鶏が先か <

 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
!
頭を冷やして定義に戻って考えてみる
GADTをつくろう びず@wasabiz
型の等しさ(1/2)
• Identity of indiscernibles (Leibniz s law)
1. a = b → ( f. f a = f b)
2. ( f. f a = f b)...
GADTをつくろう びず@wasabiz
型の等しさ(2/2)
• ライプニッツの法則は二階論理の式
• 型システムにもrank-n多相が必要
• Haskell(GHC): RankNTypes
• OCaml: first-class mod...
GADTをつくろう びず@wasabiz
ここまでの話
• GADTはtype equalityがあれば作れる
• type equalityはrank-2(or more)多相的なもので作れる
!
GADTをつくろう びず@wasabiz
ここまでの話
• GADTはtype equalityがあれば作れる
• type equalityはrank-2(or more)多相的なもので作れる
!
→実際に作ってみる
!
• キモになるデータ型
• Equal a b型の値が存在する
= 型aと型bが等しいことの「証明」
GADTをつくろう びず@wasabiz
data Equal a b = Cast (forall f. f a -> f b)
!
• reflexivity
• a. a = a
GADTをつくろう びず@wasabiz
refl :: Equal a a
refl = Cast id
!
• ライプニッツの右方向
• a = b f. f a = f b
GADTをつくろう びず@wasabiz
newtype Box f1 f2 a
= Box { unBox :: f1 (f2 a) }
!
lift :: Equal ...
!
• 実際に証明する時に使う便利関数
• 「『a = b』の証明と型a」から型bを取り出す
GADTをつくろう びず@wasabiz
newtype Id a = Id { unId :: a }
apply :: Equal a b -> ...
GADTをつくろう びず@wasabiz
実際に使ってみる
GADTをつくろう びず@wasabiz!
• 例(1)
• 型安全eval
• 実行時に型エラーが絶対発生しない
data Expr a
= EConst a
| EIf (Expr Bool) (Expr a) (Expr a)
| EEq...
GADTをつくろう びず@wasabiz
• 例2
• 型付printf/scanf
• 実装は略
!
GADTをつくろう びず@wasabiz
まとめ
• (制限付き)GADTは自作できる
Equal, refl, apply, lift
• higher-rank多相でできる
• liftを実装するために必要
GADTをつくろう びず@wasabiz
ただし…
• ほとんどのケースではEqual,refl,applyだけあれば
OK
• これだけならHaskell 98の範疇で実装できる
data WeakEqual a b
= WE (a -> b)...
GADTをつくろう びず@wasabiz
大まとめ
• (制限付き)GADTはhigher-rank多相で作れる
Equal, refl, apply, lift
• (さらに制限付き)GADTは言語拡張なしで作れる
Equal, refl, ap...
GADTをつくろう びず@wasabiz
とはいえ…
GADTをつくろう びず@wasabiz
こんな面倒なことをせずに素
直にGADTを使いましょう!
\(^o^)/
GADTをつくろう びず@wasabiz
• 元ネタ: http://okmij.org/ftp/ML/GADT.ml
• 参考: https://blogs.janestreet.com/more-
expressive-gadt-encod...
Upcoming SlideShare
Loading in...5
×

Functional lt-2014

198

Published on

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

No Downloads
Views
Total Views
198
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Functional lt-2014

  1. 1. GADTをつくろう びず@wasabiz
  2. 2. 自己紹介 • Yuichi Nishiwaki • @wasabiz • 大学生です(やさしくしてね) • DeNAでJSXという言語をつくったり趣味で schemeのJITコンパイラつくったり
  3. 3. GADTをつくろう 今日のおはなし • HaskellのGADTの話 びず@wasabiz
  4. 4. GADTをつくろう 今日のおはなし • HaskellのGADTの話 • GADTの実用(いつ使うか・どこで使うか) びず@wasabiz
  5. 5. GADTをつくろう 今日のおはなし • HaskellのGADTの話 • GADTの実用(いつ使うか・どこで使うか) びず@wasabiz という話はしません
  6. 6. GADTをつくろう ! • HaskellのGADTの話 • GADTの実用(いつ使うか・どこで使うか) びず@wasabiz ↑の話に期待した人
  7. 7. はい残念でしたー
  8. 8. GADTをつくろう 今日のおはなし ☓ GADTの使い方 ○ GADTの作り方 ◎ GADTのサポートがない言語でGADTをエ ミュレートする びず@wasabiz
  9. 9. GADTをつくろう 今日のおはなし ☓ GADTの使い方 ○ GADTの作り方 ◎ GADTのサポートがない言語でGADTをエ ミュレートする びず@wasabiz
  10. 10. GADTをつくろう 今日のおはなし ☓ GADTの使い方 ○ GADTの作り方 ◎ GADTのサポートがない言語でGADTをエ ミュレートする びず@wasabiz
  11. 11. GADTをつくろう びず@wasabiz GADTとは データコンストラクタの型を指定できる凄い奴
  12. 12. GADTをつくろう びず@wasabiz GADTの理論的背景 • HM = (restricted) System F • GADT = System F + type-equality proof System F
  13. 13. 型の等しさが判定できればGADTが作れる! {-# LANGUAGE GADTs #-}なしで
  14. 14. ( ) 。o(待てよ、型の等しさってどうやって判定するんだ…?)
  15. 15. ¦Google検索¦ ┗(☋` )┓三
  16. 16. ( ◠◠ )☛ Data.Type.Equality - Hackage
  17. 17. ( ^o^) 超かんたんじゃん!これ使えば一発wでもどうやって実装し    てるんだろう…?
  18. 18. ¦ソースコード¦ ┗(☋` )┓三
  19. 19. ( ◠◠ )☛ {-# LANGUAGE GADTs #-}
  20. 20. ▂▅▇█▓▒░( ω )░▒▓█▇▅▂ うわああああああああ
  21. 21. _人人人人人人人人人人_
 > 卵が先か鶏が先か <
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
  22. 22. ! 頭を冷やして定義に戻って考えてみる
  23. 23. GADTをつくろう びず@wasabiz 型の等しさ(1/2) • Identity of indiscernibles (Leibniz s law) 1. a = b → ( f. f a = f b) 2. ( f. f a = f b) → a = b • 実際は(1)+reflexivityの制限付きGADTでも問題ない
  24. 24. GADTをつくろう びず@wasabiz 型の等しさ(2/2) • ライプニッツの法則は二階論理の式 • 型システムにもrank-n多相が必要 • Haskell(GHC): RankNTypes • OCaml: first-class modules
  25. 25. GADTをつくろう びず@wasabiz ここまでの話 • GADTはtype equalityがあれば作れる • type equalityはrank-2(or more)多相的なもので作れる !
  26. 26. GADTをつくろう びず@wasabiz ここまでの話 • GADTはtype equalityがあれば作れる • type equalityはrank-2(or more)多相的なもので作れる ! →実際に作ってみる
  27. 27. ! • キモになるデータ型 • Equal a b型の値が存在する = 型aと型bが等しいことの「証明」 GADTをつくろう びず@wasabiz data Equal a b = Cast (forall f. f a -> f b)
  28. 28. ! • reflexivity • a. a = a GADTをつくろう びず@wasabiz refl :: Equal a a refl = Cast id
  29. 29. ! • ライプニッツの右方向 • a = b f. f a = f b GADTをつくろう びず@wasabiz newtype Box f1 f2 a = Box { unBox :: f1 (f2 a) } ! lift :: Equal a b -> Equal (f a) (f b) lift (Cast f) = Cast (unBox . f . Box)
  30. 30. ! • 実際に証明する時に使う便利関数 • 「『a = b』の証明と型a」から型bを取り出す GADTをつくろう びず@wasabiz newtype Id a = Id { unId :: a } apply :: Equal a b -> a -> b apply (Cast f) = unId . f . Id
  31. 31. GADTをつくろう びず@wasabiz 実際に使ってみる
  32. 32. GADTをつくろう びず@wasabiz! • 例(1) • 型安全eval • 実行時に型エラーが絶対発生しない data Expr a = EConst a | EIf (Expr Bool) (Expr a) (Expr a) | EEq (Equal Bool a) (Expr a) (Expr a) | EAdd (Equal Int a) (Expr a) (Expr a) … ! eval :: Expr a -> a
  33. 33. GADTをつくろう びず@wasabiz • 例2 • 型付printf/scanf • 実装は略 !
  34. 34. GADTをつくろう びず@wasabiz まとめ • (制限付き)GADTは自作できる Equal, refl, apply, lift • higher-rank多相でできる • liftを実装するために必要
  35. 35. GADTをつくろう びず@wasabiz ただし… • ほとんどのケースではEqual,refl,applyだけあれば OK • これだけならHaskell 98の範疇で実装できる data WeakEqual a b = WE (a -> b) (b -> a)
  36. 36. GADTをつくろう びず@wasabiz 大まとめ • (制限付き)GADTはhigher-rank多相で作れる Equal, refl, apply, lift • (さらに制限付き)GADTは言語拡張なしで作れる Equal, refl, apply
  37. 37. GADTをつくろう びず@wasabiz とはいえ…
  38. 38. GADTをつくろう びず@wasabiz こんな面倒なことをせずに素 直にGADTを使いましょう! \(^o^)/
  39. 39. GADTをつくろう びず@wasabiz • 元ネタ: http://okmij.org/ftp/ML/GADT.ml • 参考: https://blogs.janestreet.com/more- expressive-gadt-encodings-via-first-class- modules/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×