GADTブランチの今

7,536 views
7,408 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,536
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

GADTブランチの今

  1. 1. GADTについて 名古屋Reject会議 GADTブランチの今 2011年2月26日 有限会社ITプランニング 小笠原 啓
  2. 2. 直球でいくよ <ul><li>GADT とは何か? </li></ul>
  3. 3. 発音難しいね G eneralized A lgebraic D ata t ypes
  4. 4. 代数的データ型の拡張ですわ <ul><li>Coqでお馴染みのInductive Datatypes程強力じゃないけど、型推論できるというバランスを保った妙技。
  5. 5. 発端となる&quot;Guarded Recursive Datatype Constructors&quot;(by Hongwei Xi, Chiyan Chen and Gang Chen)や&quot;First-Class Phantom Types” (by James Cheney and Ralf Hinze)などの論文が2003年。
  6. 6. その後型推論について色々と議論されよい結果が出た。始代数による意味論も与えられた。
  7. 7. Haskellには実装済み。 </li></ul>
  8. 8. で、何それおいしいの? 意外とおいしいんだな、これが。
  9. 9. 今日はOCamlの話 1. 存在型が書けるようになる。 (OCaml) 2. 不変量 (invariant) を減らせる。
  10. 10. 存在型=型パラメータを隠せる Objective Caml version 3.13.0-gadt (2010-10-22) # type t = 'a list;; Error: Unbound type parameter 'a # type t = List : 'a list -> t;; type t = List : 'a list -> t ’ a が存在型
  11. 11. 例えばコンビネーターの型 type 'a event = Return of 'a | Join of 'a event event | Choose of 'a event list | Guard of unit -> 'a event | Wrap of ('b -> 'a) * 'b event あれ?書けないぞ。
  12. 12. GADTなら大丈夫 type 'a event = Return : 'a -> 'a event | Join : 'a t t -> 'a event | Choose : 'a event list -> ' a event | Guard : (unit -> 'a event) -> 'a event | Wrap : ('b -> 'a) * 'b event -> 'a event やったね!
  13. 13. 不変量(お約束)は避けたいね type term = Int of int | String of string | Mul of term * term Mul 構文は本当は Int バリアントにしか許したくないのに、 term 全体を受け取るしかない。
  14. 14. GADTなら大丈夫! # type _ term = Int : int -> int term | String : string -> string term | Mul : int term -> int term -> int term 気にしなきゃイケない 不変量(お約束)が減ったよ!
  15. 15. 例えば型付きSQLクエリ type column = string (* カラム名 *) type _ term = (* 項。簡略版 *) | Int : int -> int term | String : string -> string term | IntColumn : column -> int term | StringColumn : column -> string term
  16. 16. where要素 type compare_op = EQ | GE | LE type 'a where_elem = 'a term * compare_op * 'a term type _ where = | WReturn : 'a where_elem -> 'a where | WOr : ('a where_elem * 'b where) -> ('a * 'b) where | WAnd : ('a where_elem * 'b where) -> ('a * 'b) where
  17. 17. select要素とfrom要素 type _ select = | SReturn : 'a term -> 'a select | SCons : ('a term * 'b select) -> ('a * 'b) select type from = | Table : string -> from | Join : from * from -> from
  18. 18. 型付きクエリの出来上がり type _ query = Query : 'a select * from * 'b where option -> 'a qeury
  19. 19. 実際に作ってみた val sql : (string * int) select * from * (string * int) where option = (SCons (StringColumn &quot;name&quot;, SReturn (IntColumn &quot;age&quot;)), Table &quot;person&quot;, Some (WAnd ((StringColumn &quot;name&quot;, EQ, String &quot;ogasawara&quot;), WReturn (IntColumn &quot;age&quot;, GE, Int 20))))
  20. 20. 型付きクエリを使ってごにょごにょ (* 型で守ってから文字列に変換 *) val to_strng : type s. s query -> string (* 型付きクエリを実行して型付き結果をもらう *) val execute : type s. s query -> db -> s seq 夢が広がるよ!
  21. 21. 今日からあなたもGADTer! インストールは簡単! $ svn co http://caml.inria.fr/svn/ocaml/branches/gadts $ cd gadts $ ./configure; make world.opt $ sudo make install
  22. 22. 参考情報: <ul><li>GADTs web page(文法がやや古い) </li><ul><li>https://sites.google.com/site/ocamlgadt/ </li></ul><li>caml-listでの文法に関する議論 </li><ul><li>http://www.mail-archive.com/caml-list@yquem.inria.fr/msg08135.html </li></ul><li>そもそもGADTsとは? </li><ul><li>http://www.haskell.org/haskellwiki/GADT </li></ul></ul>
  23. 23. ご質問があればお気軽に ご清聴ありがとうございました。

×