Example5.1

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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 はプログラムのどこか他で使われていない新規な名前です。無名関数は「糖衣構文」であるとも言います。


  • 本当にお疲れさまです (実に素晴らしい貢献ですね(^^)) 。「それら引数の関数の為」の「引数の関数」は「引数のための (小さな) 関数」もしくは「引数用の (小さな) 関数」の方が良いように感じました。 -- ryugate (2008-05-19 22:27:45)
  • 「しばしば Scala コンパイラは省略可能な場合には仮引数型を無名関数の文脈から推論可能です。」は、直訳的ですが「しばしば、Scala コンパイラは無名関数の文脈からそのパラメータの型を推論でき、その場合はそれらは省略できます。」な感じはいかがでしょうか。 -- ryugate (2008-05-19 22:36:32)
名前:
コメント:
最終更新:2011年02月24日 08:33
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。