2012-06-04 2 views
7

currying multi parameter-groups method is possible을 발견 한 후 암시 적 매개 변수가 필요한 부분적으로 적용된 함수를 얻으려고합니다.스칼라, 암시 적 매개 변수를 포함하여 다중 매개 변수 그룹 메서드에서 대기 중입니까?

이음새는 그렇게 할 수 없습니다. 왜 그랬는지 설명 할 수 없습니까?

scala> def sum(a: Int)(implicit b: Int): Int = { a+b } 
sum: (a: Int)(implicit b: Int)Int 

scala> sum(3)(4) 
res12: Int = 7 

scala> val partFunc2 = sum _ 
<console>:8: error: could not find implicit value for parameter b: Int 
     val partFunc2 = sum _ 
        ^

이 부분적으로 적용된 함수를 작성하기 위해 싱글 톤 객체를 사용하고 암시 적 int가 정의 된 범위에서 사용하고 싶습니다.

답변

8

범위에 암시적인 Int가 없기 때문입니다. 참조 :

scala> def foo(x: Int)(implicit y: Int) = x + y 
foo: (x: Int)(implicit y: Int)Int 

scala> foo _ 
<console>:9: error: could not find implicit value for parameter y: Int 
       foo _ 
      ^

scala> implicit val b = 2 
b: Int = 2 

scala> foo _ 
res1: Int => Int = <function1> 

암시 적은 컴파일러에서 실제 값으로 대체됩니다. 당신이 메서드를 카레하면 결과는 함수이고 함수는 암시적인 매개 변수를 가질 수 없으므로 컴파일러는 메서드를 카레 할 때 값을 삽입해야합니다.

편집 :

object Foo { 
    def partialSum(implicit x: Int) = sum(3)(x) 
} 
+0

감사 : 사용 사례를 들어

, 왜 뭔가를하려고하지 않습니다. 하지만 내가 말했듯이이 함수를 다른 싱글 톤 객체로 선언해야합니다. 나는 그것을 사용하는 맥락에서 선언 할 필요가있다. – iwalktheline

+0

내 게시물을 편집했습니다. 이미 언급 한 이유들로 인해 다른 방법이 없다고 생각합니다. – drexin

+0

당신이 옳습니다. 함수와 함수가 암시적인 매개 변수를 허용하지 않는다는 커링이 있으므로 두 그룹 중 하나의 매개 변수를 명시 적으로 나열해야합니다. – iwalktheline

0
scala> object MySingleton { 
| def sum(a: Int)(implicit b: Int): Int = { a+b } 
| 
| 
| def caller(a: Int) = { 
|  implicit val b = 3; // This allows you to define the partial below 
|  def pf = sum _  // and call sum()() without repeating the arg list. 
|  pf.apply(a) 
| } 
| } 
defined module MySingleton 


scala> MySingleton.caller(10) 
res10: Int = 13 
+3

안녕하세요. SO! 코드를 게시하는 대신 직관적 인 설명을 남기십시오. – vefthym

관련 문제