2011-03-18 2 views
3

이 코드는 컴파일 오류 제공 :스칼라 : 유형의 컴파일 오류 선언 계속 모든 => 아무것도

import scala.util.continuations._ 

object CTest { 
    def loop: Nothing = reset { 
     shift {c: (Unit => Nothing) => c()} 
     loop 
    } 

    def main(argv: Array[String]) {loop} 
} 

오류 메시지 :

error: type mismatch; 
found : ((Unit) => Nothing) => (Unit) => Nothing 
required: ((Unit) => B) => (Unit) => Nothing 

을하지만이 코드는 예상대로 작동합니다

import scala.util.continuations._ 

object CTest { 
    def loop: Nothing = reset { 
     shift {c: (Unit => Any) => c.asInstanceOf[Unit => Nothing]()} 
     loop 
    } 

    def main(argv: Array[String]) {loop} 
} 

질문 : 스칼라 컴파일러가 왜 싫어하는가 co Any => Nothing 유형의 ntinuations?

+0

'루프'가 자신이 생각하는대로하고 있는지 궁금합니다. 대신'() => loop' 또는'loop _'을 써보십시오. –

+0

'loop'의 유일한 목적은 끝없이 반복적으로 호출하는 것입니다 (다른 메소드를 호출하지만이 코드는 예제를 단순화하기 위해 생략되었습니다). –

답변

3

그것은 컴파일 : 그것은BNothing 것을 추측한다 컴파일러 처럼 나에게 보이는

shift[Unit, Nothing, Nothing] {c: (Unit => Nothing) => c()} 

하지만, 그렇지 않습니다.

+1

'shift [Unit, Nothing, Nothing] {c => c()}'도 작동합니다. 그것은 확실히 continuations plugin의 버그입니다. –

1

유형이 없기 때문에 Nothing 유형을 반환 할 수 없습니다. Nothing을 반환 할 것으로 예상되는 코드는 절대 반환하면 안됩니다. 예를 들어 항상 예외를 throw하는 메서드는 아무 것도 반환하지 않는 것으로 선언 될 수 있습니다.

스칼라에서는 voidUnit 인 자바가 반환되었습니다.

자세한 내용은 제임스 아이리 (James Iry)가 Getting to the Bottom of Nothing at All에 대해 말한 내용을 확인하십시오. 나는 형의 인수를 지정하면

+0

예,하지만 ** 아무 것도 ** 반환하고 싶지 않습니다. 루프 메서드를 살펴보십시오. 결코 돌아 오지 않습니다. 제 질문은 그러한 연속을 선언 할 수없는 이유입니다. –