プログラミング言語SML#解説 3.7.1版
7 MLプログラミング入門

7.14 作用順,左から右への評価戦略

手続き的処理を書くためにはプログラムの各部分の実行順序を決める必 要があります. 値を表す式を組み合わせてプログラムを書いていく関数型言語では,書 かれたプログラムの実行は,式の値を求めることに対応します. これを,式の評価と呼びます. MLでは,式の評価は以下のような順で行われます.

  1. 1.

    式は,同一レベルであれば,左から右に評価する. たとえば,(power 2) (power 2 2)の場合, まず(power 2)が評価され2乗する関数が得られ, 次に(power 2 2)が評価され4が得られ,最後に,2乗する関数に4が適用さ れ,14が得られます. また,宣言の列は,宣言の順に評価されます.

  2. 2.

    関数の本体は,引数に適用されるまで評価されない.

さらに,手続き的な処理を容易にするために,以下の逐次評価構文が用 意されています.

expr  ::=
 | (expr ;expr)    (逐次評価構文)

(expr1 ;exprn)は, expr1からexprnまで順番に評価し,最後の式exprnの値を返す構文です.

以上の評価順序のもとで参照型を使えば,手続き的な処理を関数型言語 の枠組みで,簡単に書くことができます. たとえば新しい名前を生成する関数は,以下のように書けます.

fun makeNewId () =
  let
    val cell = ref 0
    fun newId () =
      let
        val id = !cell
      in
        (cell := id + 1; id)
      end
  in
    newId
  end