2016-07-08 6 views
1

Я пытаюсь объявить простой метод в scala с несколькими списками параметров.анонимная функция с несколькими списками параметров

Эти две работы.

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

Несколько списков параметров ** - ** currying. Это всего лишь два разных способа описания одного и того же. И все, что находится справа от знака '=', взятого в целом, ** - это анонимная функция. Я добавил пример анонимного использования. – jwvh