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}
}

問題は、ScalaコンパイラがAny =>Nothing型の継続を嫌う理由です

4

2 に答える 2

3

型引数を指定するとコンパイルされます。

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

コンパイラがそれを推測する必要があるように見えますがBNothingそうではありません。

于 2011-03-19T06:42:50.007 に答える
1

Nothingインスタンスがないため、タイプを返すことはできません。戻ることが期待されるコードは、Nothing決して返さないようにする必要があります。たとえば、常に例外をスローするメソッドは、何も返さないものとして宣言される場合があります。

Javaが呼び出すもののリターンはvoidScalaUnitにあります。

詳細については、JamesIryが「何もない底に到達する」について何と言っていたかを見てみませんか。

于 2011-03-18T20:24:24.387 に答える