Scala では複数の引数リストを持つメソッドを定義できる。読んで字の如く、引数リストが複数あるってことだ。
scala> class Adder { | def add(x: Int)(y: Int) = x + y | } defined class Adder
こんなふうに、引数リストを囲むカッコを連ねる。呼び出すときも同様。
scala> val adder = new Adder() adder: Adder = Adder@2a83bab5 scala> adder.add(2)(3) res0: Int = 5
引数リストの代わりに _ を使うと部分適用ができる。
scala> val fun = adder.add(3) _ fun: Int => Int = $$Lambda$3397/284877983@4dddc7e7
この fun は関数オブジェクトのようなものなのかな。残りと引数を与えると値が返ってくる。
scala> fun(4) res1: Int = 7
いまは後ろの引数リストの代わりに _ を使ったけど、前の引数リストの代わりには使えないんだろうか。
scala> val fun2 = adder.add _ (3) <console>:1: error: ';' expected but '(' found. val fun2 = adder.add _ (3) ^
ダメか。
部分適用は、単一の引数リストでも使える。Adder クラスを定義しなおしてみよう。
scala> class Adder { | def add(x: Int, y: Int) = x + y | } defined class Adder
この新しい Adder クラスの add メソッドで部分適用を試してみる。
scala> val fun: Int => Int = adder.add(2, _) fun: Int => Int = $$Lambda$3365/582762225@4e9e818e scala> fun(3) res0: Int = 5
関数オブジェクト(?)の型はを省略できないみたいだ。省略するとエラーになる。
scala> val fun = adder.add(2, _) <console>:12: error: missing parameter type for expanded function ((x$1: ) => adder.add(2, x$1)) val fun = adder.add(2, _) ^
ところで、こっちの形式なら後ろの引数を部分適用できるんだろうか。
scala> val fun2: Int => Int = adder.add(_, 3) fun2: Int => Int = $$Lambda$3381/567903408@64679683 scala> fun2(5) res1: Int = 8
できた。