scala分隔的continuations类型
我仍在弄清楚这里涉及的确切打字规则/含义 如果示例中的类型“足够简单”到“适合”,这似乎很容易,但与tiark rompf给出的类型相比(至少对我而言),情况变得更加复杂/困难: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((
|- 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
expectedFloat@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|]} )