Проблема в следующем: если в блоке shift объявить продолжение, как возвращающее тип Nothing, то компилятор ругается:
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 => Nothing) => c()}
loop
}
def main(argv: Array[String]) {loop}
}
Однако, если сделать вот так:
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}
}
то всё работает, как и ожидается (т. е. падает от переполнения стека, гг). Кто знает, чем компилятору не нравится тип Nothing в continuation?