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

(x:Int) => x * x

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

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

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

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


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

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

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

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

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら