(11)[ML] 式の組み合わせによるプログラミング

[ トップ | 目次 | 前ページ | 次ページ ]


何度か説明している通り,MLのプログラムは一つの式であり,大きなプログラムも種々の式を組み合わせて作られる一つの式である,式を書いていく上で変数や定数を使うが,MLの変数はメモリー領域に付けられた名前ではなく,値に付けられた名前であり,その評価の結果はその値である,したがって,Cと違い,MLでは変数への代入などの「実行文」という概念はない,その代わり,式が計算した値に名前を付ける以下の形の宣言文が用意されている,

# val x = 1 + 1;
val x = 2 : int

この後変数xは値2をもつint型の式として使用することができる,

MLの基本原則の2つ目は,この式の組み合わせに関するものである,

式は型が合っている限り,どのように組み合わせてもよい

この原則を理解するために,以下の例を見てみよう,

SML# 0.20 (2007-03-30 10:47:08 JST)
# val x = 1 + 1;
val x = 2 : int
# x = 1;
val it = false : bool
# if x = 1 then 1 else 2;
val it = 2 : int
# case x of 2 => 0 | _ => 1;
val it = 0 : int

2行目のx = 1はxへの代入ではなく,xの値と1が等しいか否かの比較である,このように比較もbool型をもつ式である,さらにif文もcase文も実行文ではなくint型の値を計算する式である,上記の原則は,これら式はint型の式が書けるところならどこに書いてもよいことを意味する,そこで,例えば以下のような式が書ける,

# (case x of 2 => 0 | _ => 1) + (if x = 1 then 1 else 2);
val it = 2 : int

let式に関しても事情は同じである,

# let val x = 1 + 1 in x + x end;
val it = 4 : int

上記のlet式はint型の値を計算する式であるから,int型が書けるところにならどこに書いてもよい,

# (let val x = 1 + 1 in x + x end) + 2;
val it = 6 : int

関数を引数に適用する式も型が正しいところに自由に書くことができる,例えばfactorial関数の定義の後はfactorial変数は以下の関数型をもつ式である,

# factorial;
val it = fn : int -> int

この関数をint型の値に適用して得られる式はint型であるから,以下のようにint型の式が書けるところに書くことができる,

# (let val x = factorial 10 in x + x) + 2;
val it = 7257602 : int

MLでは,以上の原則に従い,if式やcase式,関数適応式などを組み合わせて,目的とする値を計算する一つの式を構築していく,

以上の知識を使い,CとMLで種々の関数を書く演習をやってみよう,


[ トップ | 目次 | 前ページ | 次ページ ]