2013-10-24 2 views
2

def f(x: Int)(y: Int) = x + ydef f(x: Int) = (y: Int) => x + y의 차이점은 무엇입니까? 나는 후자와 같은 전자를 취급 할 때 REPL은 행복하지 않는 것여러 인수 목록과 함수 반환의 차이점은 무엇입니까?

:

scala> def f(x: Int)(y: Int) = x + y 
f: (x: Int)(y: Int)Int 

scala> f(42) 
<console>:9: error: missing arguments for method f; 
follow this method with `_' if you want to treat it as a partially applied function 
       f(42) 
      ^

scala> def f(x: Int) = (y: Int) => x + y 
f: (x: Int)Int => Int 

scala> f(42) 
res2: Int => Int = <function1> 

무엇 정확한 차이가 나는 어떤 양식을 사용해야 할 때? 컴파일러에 의해 제안

+0

글쎄, 하나는 두 개의 인수를 갖는 함수이고 하나는 하나의 인수를 취하는 함수를 반환합니다. 아니? –

+0

내가 생각하기를 좋아하는 방식은 첫 번째는 두 개의 단항 arglist가 'Int'를 반환하는 메소드이다. (따라서'f (0)'의 결과는 여전히'(y : Int) Int' 메소드이다.) 반면 후자는 하나의 단항 arglist가 단항 함수'Int => Int'를 리턴하는 메소드입니다. 이것은 왜 오직 이전의 누락 된 밑줄의 불평을 설명합니다; 이 경우'f (0)'는 함수로 평가되지 않습니다. – Hugh

답변

3

의 차이는

def f(x: Int)(y: Int) = x + y 

는 카레 기능입니다. 두 개의 매개 변수 목록이있는 함수입니다. 하나의 인수와 함께 사용할 수 있지만 어느 인수를 지정해야합니다.

f(42) _ // this is short for f(42)(_: Int) 

x의 값이다 42 일부 응용 함수를 생성한다. 당신은 또한 할 수 :

f(_: Int)(42) // note: the first parameter must be used this way 

42y의 값을 설정합니다.
몇 가지 매개 변수로 카 트리 함수를 호출하면 부분 적용 함수가 생성됩니다.

def f(x: Int) = (y: Int) => x + y 

은 부분 적용 기능입니다. 여기에는 하나의 인수를 취하여 인수 자체를 취하는 함수를 반환하는 함수가 있습니다.

관련 문제