开发者

Scala: compilation error when declaring continuation of type Any => Nothing

This code gives compilation error:

import scala.util.continuations._

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

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

Error message:

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

But this code works as expected:

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

The question is: why Scala compiler ha开发者_Go百科tes me continuations of type Any => Nothing?


It compiles if I specify the type arguments:

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

It looks to me like the compiler should infer that B is Nothing, but it doesn't.


You can't return the type Nothing, because it has no instances. Any code that is expected to return Nothing must never return. For example, a method which always throws exceptions may be declared as returning nothing.

A return of what Java calls void is Unit in Scala.

For more information, why don't you see what James Iry had to say about Getting to the Bottom of Nothing at All.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜