2

ここに含まれる正確な入力規則/意味をまだ解明中です。

ほとんどすべての単純な例がそうであるように、例の型が「十分に単純」で「うまく収まる」場合は簡単/簡単に思えますが、タイピングと比較すると、(少なくとも私にとっては)より興味深い/困難になります。 tiark rompf によって与えられた:

|- e: A@cpsParam[B,C]; {[|r|]}: U
-----------------------------------------------------
[|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )

したがって、の結果は、tiark の論文で指定された map の定義に応じ[|e|].map( (x: A) => {[|r|]} )た型になります。Shift[U,B,C]

ここで、U は必ずしも B と同じではありません。

これまでのところ、tiark の論文の map の定義で指定されている U <: B のようなものがなくても、U が B と異なることが許される理由がわかりません。

ここでそれぞれ何が理解できていないのですか?

ヒント/アイデアはありますか?

4

1 に答える 1

1

どちらの場合も、選択的cps変換の結果がどのようになるかを確認したかったので、これをもう一度確認しました。

  1. U <:B
  2. UはBのサブタイプではありません

次の簡単な例を使用しました。

package sample

import scala.util.continuations._

class Depp {
  override def toString = "DEPP"
}

class Sepp extends Depp {
  override def toString = "DEPP->SEPP"
}

object Sample extends Application {
  val depp = new Depp
  val sepp = new Sepp
  val res = reset {
    shift {
      (k: Int => Depp) => k(7)
    }
    val z = sepp
    z
  }
  println("Result = "+ res)
}

これを使用してコンパイルする

scalac -P:continuations:enable -Xprint:selectivecps Sample.scala

成功したことが証明され、次の結果が得られます(興味深い部分のみ)。

private[this] val res: sample.Depp = scala.util.continuations.package.reset[sample.Sepp, sample.Depp]({
   package.this.shiftR[Int, sample.Depp, sample.Depp](((k: (Int) => sample.Depp) => k.apply(7))).map[sample.Sepp]
     tmp1;
     val z: sample.Sepp = Sample.this.sepp;
     z
   }))

わかりました。結果の(マップのアプリケーション)Shiftオブジェクトのタイプは[Sepp,Depp,Depp]期待どおりです:)

ShiftオブジェクトがどのようA@cpsParam[A,C]に存在するかを理解しているのでこれは問題ありません(Tiarkの論文で与えられているリセット機能はそのようなShiftオブジェクトで動作します)

ここで、簡単な例で以下を変更して、デップとは関係のないタイプを生成します。z.asInstanceOf[Float]

これをコンパイルする

scalac -P:continuations:enable -Xprint:selectivecps -explaintypes Sample.scala

実際に何がチェックされているかを示す次のエラーが発生します。

Sample.scala:16: error: type mismatch;
 found   : Float @scala.util.continuations.cpsParam[sample.Depp,sample.Depp] @scala.util.continuations.cpsSynth
 required: Float @scala.util.continuations.cpsParam[Float,sample.Depp]
  val res = reset {
                  ^
Float @scala.util.continuations.cpsParam[sample.Depp,sample.Depp] @scala.util.continuations.cpsSynth <: Float @scala.util.continuations.cpsParam[Float,sample.Depp]?
  scala.util.continuations.cpsParam[sample.Depp,sample.Depp] <: scala.util.continuations.cpsParam[Float,sample.Depp]?
    Float <: sample.Depp?
      <notype> <: sample.Depp?
      false
    false
  false
false
one error found

ああ、これがテストです: Float <: sample.Depp?Floatはもちろんサブタイプではないので失敗しますDepp

質問:変換規則は次のように与えられるべきではありません:

e: A@cpsParam[B,C]  {[|r|]}: U  U <: B
-----------------------------------------------------
[|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )

これを明確に表現するには?

于 2010-11-23T19:08:48.927 に答える