null.asInstanceOf[<some CPS annotated type>]
编译失败有什么合乎逻辑的原因吗?
有关上下文,请参阅此 github 问题线程。
null.asInstanceOf[<some CPS annotated type>]
编译失败有什么合乎逻辑的原因吗?
有关上下文,请参阅此 github 问题线程。
我想知道即使编译了 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]
但无法实现。