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

7.11 高階の関数の利用

MLでクールな,つまり読みやすくかつ簡潔なプログラミングを効率良く 書いていく鍵は,高階関数の機能を理解し,高階の関数を使い,式を組み合わせ ていくことです. この技術の習得には,当然習熟が必要でこのチュートリアルで尽くせる ものではありませんが,その基本となる考え方を理解することは重要と思います. そこで,以下,簡単な例を用いて,高階の関数の定義と利用に関する考 え方を学びましょう.

数学で数列の和に関するΣ記法を勉強したと思います. この記法は以下のような等式に従います.

k=10f(k) = 0
k=1n+1f(k) = f(n)+k=1nf(k)

高校の教科書などでこの記法を学ぶ理由は,もちろん,このΣで 表現される働きに汎用性があり便利だからです. 記法k=1nf(k)の簡単な分析をしてみましょう.

  • 記法にはk,n,fの3つの変数が含まれる. この中でkは,1からnまで変化することを表す仮の変数である.

  • k=1nf(k)は,与えられた自然数nと関数fに 対して f(1)+f(2)++f(n) の値を表す式である.

従って,nと整数を引数とし整数を返す関数fを受け取る 関数,つまり高階の関数とみなすことができます. 高階の関数をプログラミングの基本とするMLでは,この関数を以下のよ うに直接定義可能です.

# fun Sigma f 0 = 0
>    | Sigma f n = f n + Sigma f (n - 1);
val Sigma = fn : (int -> int) -> int -> int

このSigmaを使えば,任意の自然数関数の和を求めることができます.

# Sigma square 3;
val it = 14 : int
# Sigma (powerCurry 3) 3;
val it = 36 : int

高階の関数は,このようにひとまとまりの機能を表現する上で大きな力 をもちます. 複雑なプログラムを簡潔で読みやすいMLのコードとして書き下していく 能力を身につける上で重要なステップは,ひとまとまりの仕事を高階の関数として 抜き出し,それらを組み合わせながら,式を作りあげていく技術をマスターする ことです. 後に第7.20節で説明するMLの多相 型システムは,このスタイルのプログラムをより容易にする機構といえます. この機構とともに,MLの高階関数を活用すれば,複雑なシステムを宣言 的に簡潔に書き下していくことができるようになるはずです.