Search code examples
scalacontinuationsscala-2.10continuation-passing

Why does null.asInstanceOf[<some CPS annotated type>] fail?


Is there any logical reason why null.asInstanceOf[<some CPS annotated type>] fails to compile?

For context, see this github issue thread.


Solution

  • I wonder if the scala 2.9 version was doing the right thing even if it compiled (I'll try when I have a chance). Anyway, in 2.10.0 this compiles and works:

    import scala.util.continuations._
    object NullCPS extends App {
      def f[A,C] = shiftUnit[A,C,C](null.asInstanceOf[A])
      println(reset{"got " + f[Object, String]})  // prints: got null
      println(reset{"got " + f[Int, String]})     // got 0
      println(reset{"got " + f[Boolean, String]}) // got false   
    }
    

    shitUnit[A,B,C] is a library method from the continuations package that uses a value of type A to create a trivial ControlContext[A,B,C] expected to be used by a continuation k of type A=>B eventually returning a result of type C.

    In my example above "got " + f[Object, String], the continuation plugin further composes the trivial null value with the (x:Object) => "got " + x function.

    Moving on to the context of the question, I cannot see how Defaultable[T] can represent the T@cps[U] since it only has one type parameter. But if you enhance Defaultable:

    import scala.util.continuations._
    trait DefCPS[A,C] { def default: A@cps[C] }
    object NullCPS extends App {
      implicit def defaultCPS[A,C] = new DefCPS[A,C] {
        def default: A@cps[C] = shiftUnit[A,C,C](null.asInstanceOf[A])
      }
      println(reset{"got " + implicitly[DefCPS[Object,String]].default})
      println(reset{"got " + implicitly[DefCPS[Int,String]].default})
      println(reset{"got " + implicitly[DefCPS[Boolean,String]].default})
    }
    // prints got null
    //        got 0
    //        got false
    

    Notes: I had to make the trait use a def instead of val or it would not compile. I also tried materializing a A@cpsParam[B,C] but was not able.