2016-07-08 8 views
1

複数のパラメータリストを持つscalaで簡単なメソッドを宣言しようとしています。複数のパラメータリストを持つ匿名関数

これらの2つが機能します。

scala> def add(a:Int, b:Int) = a+ b 
add: (a: Int, b: Int)Int 

scala> def add(a:Int)(b:Int) = a + b 
add: (a: Int)(b: Int)Int 

これは...

scala> val add = (a:Int)(b:Int)=>a + b 

<console>:1: error: not a legal formal parameter. 
Note: Tuples cannot be directly destructured in method or function parameters. 
     Either create a single parameter accepting the Tuple1, 
     or consider a pattern matching anonymous function: `{ case (param1, param1) => ... } 
val add = (a:Int)(b:Int)=>a + b 

しかし、なぜ...私がしようとしているすべての値に複数のパラメータのリストを取る無名関数を割り当てることではありません。単一のパラメータリストでは動作しますが、複数のパラメータリストでは動作しません。

答えて

4

カリー化された引数を宣言するときは、構文の問題です。匿名の使用の

scala> val add = (a:Int) => (b:Int) => a + b 
add: Int => (Int => Int) = <function1> 

scala> add(4) 
res5: Int => Int = <function1> 

scala> res5(9) 
res6: Int = 13 

例:

scala> def doit(f: Int => Int => String): String = f(2)(5) 
doit: (f: Int => (Int => String))String 

scala> doit(a => b => (a+b).toString) 
res8: String = 7 
+0

カリー化は後で来ます。私は、複数のパラメータリストを持つ無名関数が必要です。 'def foo(x:Int)(y:Int)'のように、これはdefで動作しますが、無名関数をvalに代入しても動作しません。 –

+1

複数のパラメータリスト**は**カリングです。これは同じことを説明する2つの異なる方法です。 '= '記号の右側にあるものはすべて、** **無名関数です。匿名の使用例を追加しました。 – jwvh