Ch.7 MLプログラミング入門

§ 7.15. 手続き的制御

手続き的な処理を学んだところで,手続き的な言語での制御構造の記述 と式による関数の記述の関係を振り返ってみましょう. 状態の変更を伴う手続き的処理は,外部の状態を変更するI/Oなどの機能 の表現には欠かせないものです. これらは,手続き的な操作として表現するのがもっとも分かりやすいプ ログラムとなります. 手続き型言語では,これらに加え,ループや条件式などの種々の制御構 造も手続き的な機能で実現されるのに対して,MLでは式の組み合わせで表現され ます. これまで見てきた通り,MLではプログラム構造は手続き的機能に関係の ない概念ですから,表現すべき内容を式で表すMLの方がより宣言的で理解しやす いプログラムと言えます.

しかし,この点に注意が必要です. Cのような手続き型言語では,手続き的処理が基本ですから,階乗を求 める関数factは,再帰ではなく,ループを使って以下のように書くのが一 般的と思われます.

  int fact (int n) {
    int s = 1;
    while (n > 0) {
      s = s * n;
      n = n - 1;
    }
    return s;
  }

このようにループを使って書くほうが,再帰を使った書き方,たとえば MLでの

  fun fact 0 = 1
    | fact n = n * fact (n - 1)

のようなコードより効率的です. しかし,この事実は,関数型言語の本質的な非効率さを意味するもので はありません.