SlideShare a Scribd company logo
GADTについて 名古屋Reject会議 GADTブランチの今 2011年2月26日 有限会社ITプランニング 小笠原 啓
直球でいくよ GADT とは何か?
発音難しいね G eneralized  A lgebraic  D ata t ypes
代数的データ型の拡張ですわ Coqでお馴染みのInductive Datatypes程強力じゃないけど、型推論できるというバランスを保った妙技。
発端となる"Guarded Recursive Datatype Constructors"(by Hongwei Xi, Chiyan Chen and Gang Chen)や"First-Class Phantom Types” (by James Cheney and Ralf Hinze)などの論文が2003年。
その後型推論について色々と議論されよい結果が出た。始代数による意味論も与えられた。
Haskellには実装済み。
で、何それおいしいの? 意外とおいしいんだな、これが。
今日はOCamlの話 1.  存在型が書けるようになる。  (OCaml) 2.  不変量 (invariant) を減らせる。
存在型=型パラメータを隠せる 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 が存在型
例えばコンビネーターの型 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 あれ?書けないぞ。
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 やったね!
不変量(お約束)は避けたいね 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 term 気にしなきゃイケない 不変量(お約束)が減ったよ!
例えば型付きSQLクエリ type column = string  (*  カラム名  *) type _ term =  (*  項。簡略版  *) | Int : int -> int term  | String : string -> string term | IntColumn : column -> int term | StringColumn : column -> string term
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
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
型付きクエリの出来上がり type _ query =  Query : 'a select * from * 'b where option -> 'a qeury
実際に作ってみた val sql : (string * int) select * from * (string * int) where option = (SCons (StringColumn "name", SReturn (IntColumn "age")), Table "person", Some (WAnd ((StringColumn "name", EQ, String "ogasawara"), WReturn (IntColumn "age", GE, Int 20))))
型付きクエリを使ってごにょごにょ (* 型で守ってから文字列に変換 *) val  to_strng : type s. s query -> string (* 型付きクエリを実行して型付き結果をもらう *) val  execute : type s. s query -> db -> s seq 夢が広がるよ!

More Related Content

PDF
Define and expansion of cpp macro
PDF
君はまだ,本当のプリプロセスを知らない
PDF
JavaScript経験者のためのGo言語入門
PDF
闇魔術を触ってみた
PPTX
PDF
C++ Template Meta Programming の紹介@社内勉強会
PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
C++ ポインタ ブートキャンプ
Define and expansion of cpp macro
君はまだ,本当のプリプロセスを知らない
JavaScript経験者のためのGo言語入門
闇魔術を触ってみた
C++ Template Meta Programming の紹介@社内勉強会
最新C++事情 C++14-C++20 (2018年10月)
C++ ポインタ ブートキャンプ

What's hot (20)

PDF
C++の黒魔術
PPTX
競技プログラミングのためのC++入門
PDF
Hello Dark-Side C# (Part. 1)
PDF
静的型付け言語Python
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
Go1.18 Genericsを試す
PPT
わんくま東京#32 「null ヤバイのでなんとかする」
PDF
Pfi Seminar 2010 1 7
PDF
Unity + C#講座①
PDF
C++入門?
PDF
templateとautoの型推論
PDF
リテラル文字列型までの道
PDF
C++コミュニティーの中心でC++をDISる
PPTX
C# 8.0 null許容参照型
PDF
不遇の標準ライブラリ - valarray
PPTX
Python と型アノテーション
PDF
プログラムの処方箋~健康なコードと病んだコード
PPTX
Ocaml lecture slides 01 at axsh
PDF
Emcpp item31
ODP
Ruby紹介
C++の黒魔術
競技プログラミングのためのC++入門
Hello Dark-Side C# (Part. 1)
静的型付け言語Python
競技プログラミングにおけるコードの書き方とその利便性
Go1.18 Genericsを試す
わんくま東京#32 「null ヤバイのでなんとかする」
Pfi Seminar 2010 1 7
Unity + C#講座①
C++入門?
templateとautoの型推論
リテラル文字列型までの道
C++コミュニティーの中心でC++をDISる
C# 8.0 null許容参照型
不遇の標準ライブラリ - valarray
Python と型アノテーション
プログラムの処方箋~健康なコードと病んだコード
Ocaml lecture slides 01 at axsh
Emcpp item31
Ruby紹介
Ad

Viewers also liked (8)

PPTX
ぱわわっぷOCaml
PPTX
関数型言語&形式的手法セミナー(3)
PPTX
Alloy Analyzer LT
PPTX
函数プログラミングの エッセンスと考え方
PPTX
状態遷移機械を構成するための新しいイベントコンビネーターの提案(PPL2014 カテ3ポスター)
PPTX
Alloy analyzer
PPTX
Alloy論理データモデル
PPTX
線形型のある言語でLEDを光らせる
ぱわわっぷOCaml
関数型言語&形式的手法セミナー(3)
Alloy Analyzer LT
函数プログラミングの エッセンスと考え方
状態遷移機械を構成するための新しいイベントコンビネーターの提案(PPL2014 カテ3ポスター)
Alloy analyzer
Alloy論理データモデル
線形型のある言語でLEDを光らせる
Ad

Similar to GADTブランチの今 (20)

PDF
すごいH 第12章モノイド
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
Haskell超入門 Part.1
PDF
F#入門 ~関数プログラミングとは何か~
PDF
Scalaプログラミング・マニアックス
PPTX
第3章 型とクラス
PPTX
第3章 型とクラス
PPTX
サンプルで学ぶAlloy
PDF
Haskell勉強会2 in ie
PDF
Haskell Lecture 2
PPTX
Coq 20100208a
PDF
Coq Party 20101127
ODP
これから Haskell を書くにあたって
PDF
すごいHaskell読書会 第7章 (前編)
PDF
Haskell Lecture 1
PDF
Scala の関数型プログラミングを支える技術
PDF
第2回関数型言語勉強会 大阪
PDF
TAPL 勉強会(紹介編)
PDF
Introduction Xtend
PDF
プログラミング言語Scala
すごいH 第12章モノイド
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Haskell超入門 Part.1
F#入門 ~関数プログラミングとは何か~
Scalaプログラミング・マニアックス
第3章 型とクラス
第3章 型とクラス
サンプルで学ぶAlloy
Haskell勉強会2 in ie
Haskell Lecture 2
Coq 20100208a
Coq Party 20101127
これから Haskell を書くにあたって
すごいHaskell読書会 第7章 (前編)
Haskell Lecture 1
Scala の関数型プログラミングを支える技術
第2回関数型言語勉強会 大阪
TAPL 勉強会(紹介編)
Introduction Xtend
プログラミング言語Scala

GADTブランチの今