Scala: ошибка компиляции при объявлении продолжения типа Any => Nothing - PullRequest
3 голосов
/ 18 марта 2011

Этот код выдает ошибку компиляции:

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 ненавидит me продолжения типа Any => Nothing?

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

Компилируется, если я укажу аргументы типа:

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

Мне кажется, что компилятор должен сделать вывод, что B равно Nothing, но это не так.

1 голос
/ 18 марта 2011

Вы не можете вернуть тип Nothing, потому что у него нет экземпляров.Любой код, который должен возвращать Nothing, никогда не должен возвращаться.Например, метод, который всегда генерирует исключения, может быть объявлен как ничего не возвращающий.

Возвращение того, что Java вызывает void, равно Unit в Scala.

Для получения дополнительной информации, почемуРазве вы не видите, что Джеймс Айри сказал о Достигая дна вообще? .

...