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]
は、タイプの値を使用して、タイプの継続kによって使用されることが期待されるトリビアルを作成し、最終的にタイプの結果を返す継続パッケージのライブラリメソッドです。A
ControlContext[A,B,C]
A=>B
C
上記の私の例"got " + f[Object, String]
では、継続プラグインは関数を使用して自明なnull
値をさらに構成し(x:Object) => "got " + x
ます。
質問のコンテキストに移ると、タイプパラメータが1つしかないため、どのように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
注:トレイトにdef
代わりにを使用させるval
必要がありました。そうしないと、コンパイルされませんでした。私も具体化してみましA@cpsParam[B,C]
たができませんでした。