5.1 無名関数 (Anonymous Functions)

関数をパラメータとすることで、多くの小さな関数が作られます。前の例では id, square, powerOfTwo をそれぞれ別個の関数として定義し、sum に引数として渡せました。

引数用の小さな関数のために名前付きの関数定義を使う代わりに、それらを無名関数として短く書けます。 無名関数 は関数に評価される式で、関数に名前を付けずに定義できます。例として、2乗する無名関数を考えます。

(x: Int) => x * x

矢印 '=>' の前の部分は関数のパラメータで、'=>' に続く部分が本体です。たとえば、2つの引数を掛け合わせる無名関数は次のようになります。

(x: Int, y: Int) => x * y

無名関数により名前付きの外部関数を使わずに、先ほどの最初の2つの、和を求める関数を書けます。

def sumInts(a: Int, b: Int): Int = sum((x: Int) => x, a, b) def sumSquares(a: Int, b: Int): Int = sum((x: Int) => x * x, a, b)

しばしば、Scala コンパイラは無名関数の文脈からそのパラメータの型を推論でき、その場合はパラメータの型を省略できます。たとえば sumInts や sumSquares では、sum の型から最初のパラメータは Int => Int 型の関数に違いないと分かります。ですから、パラメータの型 Int は冗長であり省略できます。もし、型指定のない、ただ1つのパラメータしかない場合は、その周りの括弧も省略できます。

def sumInts(a: Int, b: Int): Int = sum(x => x, a, b) def sumSquares(a: Int, b: Int): Int = sum(x => x * x, a, b)

一般的に Scala の項 (x1:T1, ..., xn:Tn) => E は、パラメータ x1, ..., xn を式 E (E は x1, ..., xn を参照しているでしょう) の結果に対応させる関数を定義します。無名関数は Scala に必須の構文ではありません。なぜなら常に名前付き関数で表現できるからです。実際、無名関数

(x1 : T1, ..., xn : Tn ) => E

はブロック

{ def f (x1 : T1, ..., xn : Tn ) = E ; f _ }

と等価です。ただし f はプログラムのどこか他で使われていない新規な名前です。無名関数は「糖衣構文」であるとも言います。

前ページ 5 章 目次 次ページ