2017-05-21 2 views
0
scala> def sum(a:Int)(b:Int) = a+b; 
    sum: (a: Int)(b: Int)Int 

    scala> var psum = sum(5)_ 
    psum: Int => Int = $$Lambda$1035/[email protected] 

    scala> psum(23) 
    res0: Int = 28 

위의 조각은 잘하지만 확실하지 작동스칼라 세 가지 인수 기능을 무두질

scala> def sum(a:Int)(b:Int)(c:Int) = a + b + c; 
    sum: (a: Int)(b: Int)(c: Int)Int 

    scala> var psum = sum(5)_(23) 

답변

1

당신은 파서의 모호성/한계에 부딪쳤다. 당신이이 경우에 필요한 어떤

val psum = (sum(5)_)(23) 
+0

def sum (a : Int) (b : Int) (c : Int) = s "a : $ a, b : $ b, c : $ c "; val psum = (합계 (5) _) (23); psum (50) == "a : 5, b : 23, c : 50"''' – pedrofurla

+0

또한 "+"가 교환 적이기 때문에 동일한 대답 만 제공한다는 사실을 알고 있습니까? 그것은 주문이나 기능 적용과 관련이 거의 없습니다. – pedrofurla

+0

넵, 지금 내가보기에 잘못 본 것 같습니다. 그것을 고쳐, 고마워! –

1

괄호를 추가하여 해결할 수 있습니다 val psum = sum(5)(_: Int)(23)입니다. (sum(3)_)(2)은 다음과 같이 계산됩니다. sum(3)_(b: Int) => (c: Int) => sum(3)(b)(c)과 같으며이를 2에 적용하면 (c: Int) => sum(3)(2)(c)이됩니다.

+0

오, 좋은 관찰! – pedrofurla

0

내가 실수하지 않은 경우 함수에서 부분적으로 적용된 인수를 찾고 currying이 필요하지 않습니다. 다음과 같이해야합니다.

def sum(a:Int,b:Int,c:Int) = a * b + c 
    sum: (a: Int, b: Int, c: Int)Int 
sum(10, _:Int, 1) 
    res1: Int => Int = $$Lambda$1131/[email protected] 
res1 (2) 
    res13: Int = 21 
0

이것은 스칼라 구문의 제한 사항입니다.

scala> def sum(a:Int)(b:Int)(c:Int) = s"a: $a, b: $b, c: $c" 
sum: (a: Int)(b: Int)(c: Int)String 

scala> def flip[A,B,C](f:A => B => C): B => A => C = b => a => f(a)(b) 
flip: [A, B, C](f: A => (B => C))B => (A => C) 

scala> flip(sum(5))(23) 
res1: Int => String = <function1> 

scala> res1(50) 
res2: String = a: 5, b: 50, c: 23 

기본적으로, flip 진 기능의 순서를 전환, 그래서 우리는 중간 인수가 flip(sum(5))의 마지막 인수 여야 b하게 사용할 수 있습니다 : 당신은이 같은 동일한 의미를 얻을 수 있습니다.

(*) 나는 주문 함수 응용 프로그램과 관련이없는 속성을 추상화하는 줄을 다시 합계로 사용하여 자유의 여지를 남겼습니다.이 속성은 질문의 핵심이라고 해석합니다.