G'Camlの販促です。
どうもこんばんは。この不況の折路頭に迷うことになり、G'Camlの路上販売に商売替えをしたYTです。
今日はモニタの前の皆様に、G'Camlの型レベルプログラミング能力についてご紹介したいと思います。
まず、G'Camlの型レベル言語はチューリング完全であるそうです。チューリング完全ということは、ありとあらゆる計算が、コンパイル時にできるということです。(サクラの拍手)
例えば、こんなものを用意すれば、Lispみたいなセル操作をコンパイル時に行うことができます。
type ('a, 'b) cell type nil = unit val nil: unit val cons: 'a -> 'b -> ('a, 'b) cell val car: ('a, 'b) cell -> 'a val cdr: ('a, 'b) cell -> 'b
……実体?そんなものは(Obj.magic 0)を使って定義しましょう。(Obj.magic 0)でごまかしている箇所は、勿論実行すると落ちますが、コンパイル時の型付けに関して実行時の値は関係ありません。従って、型レベルプログラミングを問題無く行うことができます。
そうはいっても実際のコードは実行時にも動きますので、実行時エラーを出さないようにするためにも、また、実行時に型レベルで行った計算を繰り返させないためにも、一工夫必要です。
具体的にはlazyや関数を使い、型だけ利用します。
#let tlv = lazy (cons 1 (cons "" nil)) val tlv : (int, (string, unit) cell) cell lazy_t = <lazy>
こうしてタイプリストが作れるようになりました。ここまでは純正O'Camlでもできます。純正O'Camlにできないものは、分岐や再帰です。
G'Camlの力を持ってすれば、それも可能になります。
例えば、自然数計算。
type 'a ord = (nil, 'a) cell type zero = nil type one = zero ord val zero: zero val one: one val succ: 'a -> 'a ord val pred: 'a ord -> 'a val is_zero: [| zero -> one | 'a ord -> zero |] val add: [| zero -> zero -> zero | zero -> 'b ord -> 'b ord | 'c ord -> zero -> 'c ord | {'d -> 'e ord ord -> 'f ord < 'a} => 'd ord -> 'e ord -> 'f ord |] as 'a ...
数が扱えるということはC++のtemplate class中のenumみたいなことも真似できるわけで、Lokiみたいなことも可能です。
例えばタイプリスト操作関数。
val length: [| nil -> zero | {'b -> 'c < 'a} => ('d, 'b) cell -> 'c ord |] as 'a ...
typelist_of_tupleやtuple_of_typelistも書けちゃいますので、O'Camlでは面倒だったタプルに1要素追加する操作もあらこんなに簡単に!
static_assertなどなど応用は無限大に広がっております。
さああなたも一家にひとつG'Camlいかがですか!?
↓↓↓続きはWebで↓↓↓
http://panathenaia.halfmoon.jp/alang/typelevel/
追記
型レ用の資料も置いてあります。自分でも説明不足がありありとわかる……。今からでも直せるだけ直しますorz