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

7.10 高階の関数

powerCurry 2 3((powerCurry 2) 3)と解釈されるという ことは,ML言語における以下の重要な性質を意味しています.

(powerCurry 2)は関数である.

このようにMLでは,関数はpowerUncurryのように関数定義構文を通じて定義 された関数名だけではなくプログラムで作ることができます. このように返された値は,powerCurryの例のように,使うことが できます. さらに,名前を付けたら関数に渡したりすることができます. 例えば,以下のようなコードを書くことができます.

# val square = powerCurry 2;
val square = fn : int -> int
# square 3;
val it = 9 : int
# fun apply f = f 3;
val apply = fn : [’a. (int -> ’a) -> ’a]
# apply square;
val it = 9 : int

applyに対して推論された型は,この関数が,関数を受け取って 整数を返す関数であることを示しています.

以上の例から理解される通り,MLは以下の機能を持っています.

関数は,整数型などのデータと同様,プ ログラムが返すことができる値でああり,自由に受け渡し,使うことができる. 特に関数は,別の関数を引数として受け取ることができる.

これが,「プログラムを式で定義していく」という大原則の下での,MLプ ログラミングの最も重要な原則です. 関数を返したり受け取ったりする関数を高階の関数と呼びます.