Your SlideShare is downloading. ×
0
GADTについて 名古屋Reject会議 GADTブランチの今 2011年2月26日 有限会社ITプランニング 小笠原 啓
直球でいくよ <ul><li>GADT とは何か? </li></ul>
発音難しいね G eneralized  A lgebraic  D ata t ypes
代数的データ型の拡張ですわ <ul><li>Coqでお馴染みのInductive Datatypes程強力じゃないけど、型推論できるというバランスを保った妙技。
発端となる&quot;Guarded Recursive Datatype Constructors&quot;(by Hongwei Xi, Chiyan Chen and Gang Chen)や&quot;First-Class Phant...
その後型推論について色々と議論されよい結果が出た。始代数による意味論も与えられた。
Haskellには実装済み。 </li></ul>
で、何それおいしいの? 意外とおいしいんだな、これが。
今日はOCamlの話 1.  存在型が書けるようになる。  (OCaml) 2.  不変量 (invariant) を減らせる。
存在型=型パラメータを隠せる Objective Caml version 3.13.0-gadt (2010-10-22) # type t = 'a list;; Error: Unbound type parameter 'a # typ...
例えばコンビネーターの型 type 'a event =  Return of 'a | Join of 'a event event | Choose of  'a event list | Guard of unit -> 'a event...
GADTなら大丈夫 type 'a event =  Return : 'a -> 'a event | Join : 'a t t -> 'a event | Choose : 'a event list  -> ' a event | Gu...
不変量(お約束)は避けたいね type term = Int of int | String of string | Mul of term * term Mul 構文は本当は Int バリアントにしか許したくないのに、 term 全体を受け取...
GADTなら大丈夫! # type _ term =  Int : int -> int term  | String : string -> string term | Mul :  int term -> int term -> int t...
例えば型付きSQLクエリ type column = string  (*  カラム名  *) type _ term =  (*  項。簡略版  *) | Int : int -> int term  | String : string ->...
where要素 type compare_op = EQ | GE | LE type 'a where_elem =  'a term * compare_op * 'a term type _ where =  | WReturn : 'a...
select要素とfrom要素 type _ select = | SReturn : 'a term -> 'a select | SCons : ('a term * 'b select) -> ('a * 'b) select type ...
型付きクエリの出来上がり type _ query =  Query : 'a select * from * 'b where option -> 'a qeury
実際に作ってみた val sql : (string * int) select * from * (string * int) where option = (SCons (StringColumn &quot;name&quot;, SRe...
型付きクエリを使ってごにょごにょ (* 型で守ってから文字列に変換 *) val  to_strng : type s. s query -> string (* 型付きクエリを実行して型付き結果をもらう *) val  execute : t...
Upcoming SlideShare
Loading in...5
×

GADTブランチの今

7,176

Published on

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

No Downloads
Views
Total Views
7,176
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

Transcript of "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. ご質問があればお気軽に ご清聴ありがとうございました。
  1. A particular slide catching your eye?

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

×