scala分隔的continuations类型

scala分隔的continuations类型,scala,continuations,Scala,Continuations,我仍在弄清楚这里涉及的确切打字规则/含义 如果示例中的类型“足够简单”到“适合”,这似乎很容易,但与tiark rompf给出的类型相比(至少对我而言),情况变得更加复杂/困难: |- e: A@cpsParam[B,C]; {[|r|]}: U ----------------------------------------------------- [|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} ) 因此,[|e |].map((

我仍在弄清楚这里涉及的确切打字规则/含义

如果示例中的类型“足够简单”到“适合”,这似乎很容易,但与tiark rompf给出的类型相比(至少对我而言),情况变得更加复杂/困难:

|- e: A@cpsParam[B,C]; {[|r|]}: U
-----------------------------------------------------
[|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )
因此,
[|e |].map((x:A)=>{[|r |]})的结果将具有类型
Shift[U,B,C]
,根据蒂亚克论文中给出的map定义

这里U不一定与B相同


到目前为止,我还不明白为什么在没有类似U的东西的情况下,U可以与B不同我又看了一眼,想看看选择性cps变换在这两种情况下会产生什么结果

  • U
    {shift{(k:Int=>Depp)=>k(7)};sepp.asInstanceOf[Float]}
    根据如下规则键入:
    Float@cpsParam[Depp,Depp]
    。您看到的类型错误是因为
    reset
    expected
    Float@cpsParam[Float,Depp]
    并且重置的参数类型不正确时失败。
    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)
    }
    
    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
       }))
    
    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
    
    e: A@cpsParam[B,C]  {[|r|]}: U  U <: B
    -----------------------------------------------------
    [|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )