2017-02-01 11 views
-1

SO에 대한이 오류 메시지에 대한 질문이 많이 있지만이 문제에 대한 질문은 거의없는 것 같습니다. 스칼라 인수 오버로드의 익명 함수 형식

The argument types of an anonymous function must be fully known. (SLS 8.5) 

코드의 잘못된 블록

는 인수 과정에서 패턴 매칭 할 수 있다는 이점도 함께 루비의 블록의 기능을 에뮬레이트하려고 시도한다.

object Block { 
    def apply(f: => Unit) = apply((_: String) => f) 
    def apply(f: String => Unit) = ??? 
} 
def example() = { 
    Block { // Error! 
    case "A" => println("First letter of the alphabet") 
    case _ => println("Not the first letter of the alphabet") 
    } 
} 

은 비록 한 줄 아래로, 스칼라 내가 문자열에 일치하고있어,이 인수 유형을 추론 할 수 있음을 분명히 알 수 있습니다.

답변

1

여기서 문제는 두 개의 apply 방법이 있다는 것입니다. 하나가 있었다면 : 스칼라 응용 프로그램을보고 즉시 익명 함수의 필수 유형을 이해하는 것처럼

object Block { 
    def apply(f: String => Bool) = ??? 
} 

는 그런 모든 것이 잘 작동합니다. 그러나, 두 개 이상의 다른 방법이있을 때 :

object Block { 
    def apply(f: => Bool) = apply((_: String) => f) 
    def apply(f: String => Bool) = ??? 
} 

스칼라 apply의 응용 프로그램에서 인수의 유형을 추론 할 수 없으며,이 인수의 유형에서 사용할 apply 어떤 응용 프로그램을 추론 할 수 없으므로 그것은 반복에서 붙잡힌 다. 가장 간단한 해결책은 단순히 메소드 중 하나의 이름을 바꾸는 것입니다.

지금 전화하는 것이 훨씬 더 어렵지 않습니다.

Block { println("This is a regular application.") } 
Block.branchOff { 
    case "A" => println("A is for aardvark") 
    case "B" => println("B is for beaver") 
    case _ => println("Huh?") 
} 

그리고 형식 인수 나 명시 적 인수를 지정하지 않아도됩니다.

GitHub의 스레드에 대한 자세한 내용은 https://github.com/ReactiveX/RxScala/issues/160입니다.

1

두 개의 다른 apply() 방법을 사용한다는 아이디어가 마음에 들면 추론 엔진에 도움이됩니다.

def example() = { 
    Block{s:String => s match { 
    case "A" => println("First letter of the alphabet") 
    case _ => println("Not the first letter of the alphabet") 
    }} 
}