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]は、タイプの値を使用して、タイプの継続kによって使用されることが期待されるトリビアルを作成し、最終的にタイプの結果を返す継続パッケージのライブラリメソッドです。AControlContext[A,B,C]A=>BC

上記の私の例"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]たができませんでした。

于 2013-04-09T14:18:12.077 に答える