7.11 高階の関数の利用
MLでクールな,つまり読みやすくかつ簡潔なプログラミングを効率良く 書いていく鍵は,高階関数の機能を理解し,高階の関数を使い,式を組み合わせ ていくことです. この技術の習得には,当然習熟が必要でこのチュートリアルで尽くせる ものではありませんが,その基本となる考え方を理解することは重要と思います. そこで,以下,簡単な例を用いて,高階の関数の定義と利用に関する考 え方を学びましょう.
数学で数列の和に関する記法を勉強したと思います. この記法は以下のような等式に従います.
高校の教科書などでこの記法を学ぶ理由は,もちろん,こので 表現される働きに汎用性があり便利だからです. 記法の簡単な分析をしてみましょう.
-
•
記法にはの3つの変数が含まれる. この中では,からまで変化することを表す仮の変数である.
-
•
式は,与えられた自然数と関数に 対して の値を表す式である.
従って,はと整数を引数とし整数を返す関数を受け取る 関数,つまり高階の関数とみなすことができます. 高階の関数をプログラミングの基本とする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の高階関数を活用すれば,複雑なシステムを宣言 的に簡潔に書き下していくことができるようになるはずです.