SML# - Tutorial/011 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

[ [[トップ |Tutorial]]| [[目次|Tutorial/000]] | [[前ページ|Tutorial/010]] | [[ 次ページ |Tutorial/012]] ]
----
何度か説明している通り,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で種々の関数を書く[[演習|Tutorial/012]]をやってみよう,
----
[ [[トップ |Tutorial]]| [[目次|Tutorial/000]] | [[前ページ|Tutorial/010]] | [[ 次ページ |Tutorial/012]] ]