MinCamlの構文と型

 

MinCamlMLのサブセットです。優先順位や括弧などの細かいことを別にすると、以下のような構文をもっています。

 

e ::=
  c 定数
  op(e1, ..., en) プリミティブ演算
  if e1 then e2 else e3 条件分岐
  let x = e1 in e2 変数定義
  x 変数の読み出し
  let rec x y1 ... yn = e1 in e2 再帰関数定義
  e e1 ... en 関数呼び出し
  (e1, ..., en) 組の作成
  let (x1, ..., xn) = e1 in e2 組の読み出し
  Array.create e1 e2 配列の作成
  e1.(e2) 配列の読み出し
  e1.(e2) <- e3 配列への書き込み

 

これをMLのデータ型Syntax.tとして表したモジュールがsyntax.mlです。ただし、letlet recのように、新しい変数が定義される式では、その型も(上の構文にはありませんが)含まれています。この型を表すType.ttype.mlで定義されています。

 

T ::=
  π プリミティブ型
  T1 ... Tn T 関数型
  T1 × ... × Tn 組の型
  T array 配列型
  α 型変数

 

最後の「型変数」は、型推論のところで使用します。

 

なおMinCamlコンパイラでは、いわゆるカリー化関数の部分適用を自動ではサポートしていません。つまり、関数呼び出しではすべての引数を与えなければいけません。部分適用をしたいときは、たとえばlet rec f_123 x = f 123 x in f_123のように自分で関数定義をする必要があります(Scheme言語を知っている人は、それと同じだと思ってください)。

 

また、命令型プログラミングに必要な参照(reference)もありませんが、これは要素が一個しかないような配列で代用できます。具体的には、ref eArray.create 1 e!ee.(0)e1 := e2e1.(0) <- e2とすればOKです。

 

次へ進む