• Like
Functional lt-2014
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Functional lt-2014

  • 133 views
Published

 

Published in Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
133
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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