2016-07-08 1 views
1

여러 매개 변수 목록이있는 스칼라에서 간단한 메서드를 선언하려고합니다.여러 매개 변수 목록이있는 익명 함수

이 두 가지가 작동합니다.

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