今回はまず、関数型言語の「関数」とはそもそもどういう概念かを説明します。関数は、一つ以上の引数を取り、一つの結果(戻り値)を生成する役割を持つオブジェクトです。前回に登場したメソッド*1はクラスに従属しますが、関数は単独で利用できます。例えば、

(x:Int) => x * x

は、「関数リテラル」と呼ばれる記述方法で、この例はIntの引数を取り、それを二乗した結果(戻り値)を生成する関数を示します。また、この関数リテラルで記述される名前のない関数を「無名関数」といいます。

関数を変数に代入したり引数で渡せる

リスト1●関数を変数に代入する例
リスト1●関数を変数に代入する例
[画像のクリックで拡大表示]

 関数型言語での関数は、他の値と同様、変数に代入したり、別の関数の引数として渡したり、関数の戻り値として返したりと、基本的な操作を制限なく行える一人前のオブジェクトです。この性質を持つオブジェクトを「第一級オブジェクト」といいます。


リスト2●値としての関数を呼び出す
リスト2●値としての関数を呼び出す
[画像のクリックで拡大表示]

 例えば、リスト1は関数を変数に代入する例です。squareに代入された関数は、Int型の引数と、Int型の戻り値を持つ型として、定義されたことがわかります。定義した関数は、リスト2のようにして呼び出せます。

リスト3●関数をメソッドの引数や戻り値に利用する
リスト3●関数をメソッドの引数や戻り値に利用する
[画像のクリックで拡大表示]

 定義した引数や戻り値に間違った型を指定するとコンパイルエラーとなります。「型安全」(タイプセーフ)なので、プログラマの負担が軽減されます。関数はまた、リスト3のように通常の値と同様、関数の引数や戻り値に利用できます。このように関数を利用する関数のことを「高階関数」と呼びます。高階関数を利用することで、命令型言語では表現できないシンプルなコードが記述可能です。