4

null.asInstanceOf[<some CPS annotated type>]编译失败有什么合乎逻辑的原因吗?

有关上下文,请参阅此 github 问题线程

4

1 回答 1

1

我想知道即使编译了 scala 2.9 版本是否在做正确的事情(有机会我会尝试)。无论如何,在 2.10.0 中,它可以编译并工作:

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]continuations 包中的一个库方法,它使用 type 的值A来创建一个平凡的值,ControlContext[A,B,C]期望由 type 的 continuation k 使用,A=>B最终返回 type 的结果C

在我上面"got " + f[Object, String]的示例中,延续插件进一步将平凡的null值与(x:Object) => "got " + x函数组合在一起。

继续讨论问题的上下文,我看不出如何Defaultable[T]表示 ,T@cps[U]因为它只有一个类型参数。但是,如果您增强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

注意:我必须使特征使用 adef而不是,val否则将无法编译。我也尝试实现 aA@cpsParam[B,C]但无法实现。

于 2013-04-09T14:18:12.077 回答