不明白Scala分隔连续的输入(A @cpsParam [B,C])

时间:2010-03-13 07:46:29

标签: scala functional-programming types scala-2.8 continuations

我很难理解当值具有类型A @cpsParam[B,C]时它究竟意味着什么,以及在使用分隔连续工具时我应该将这种形式分配给我的值。

我看过一些消息来源:

http://lamp.epfl.ch/~rompf/continuations-icfp09.pdf

http://www.scala-lang.org/node/2096

http://dcsobral.blogspot.com/2009/07/delimited-continuations-explained-in.html

http://blog.richdougherty.com/2009/02/delimited-continuations-in-scala_24.html

但他们并没有给我很多直觉。在最后一个链接中,作者试图给出明确的解释,但无论如何还不够明确。

  

此处的A表示计算的输出,也是其延续的输入。 B表示该延续的返回类型,C表示其“最终”返回类型 - 因为shift可以对返回值进行进一步处理并更改其类型。

我不明白“计算的输出”,“延续的返回类型”和“延续的最终返回类型”之间的区别。它们听起来像是同义词。

2 个答案:

答案 0 :(得分:20)

所以,人们帮助我在其他地方使用这个。这是答案:

reset ({
    ...
    ...shift((k:A=>B) => ...::C)::A...
    ...
}::B)::C

因此,shift是类型为A的计算{...}中的B类型的洞。 shift的参数返回C类型的值,这就是reset ({...})类型为C的原因。

理解这些内容的关键技巧是看{...}reset {...}具有不同的类型,具体取决于shift的参数返回的类型。

例如:

reset ({
    "number "+shift((k:Int=>String) => List(k(1), k(2), k(3)))
})

返回List("number 1", "number 2", "number 3")

此处AIntBStringCList[String],因为{"number" + _}为(此处)a从IntString的函数以及shift的参数,假设该函数生成List[String],它将成为reset({...})的结果。

答案 1 :(得分:1)

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

如果示例中的类型“足够简单”以“适合”如上所示,似乎容易/容易,但在比较事物与tiark的输入时,它变得更加有趣(至少对我而言) rompf:

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

因此[|e|].map( (x: A) => {[|r|]} )的结果将根据tiark的论文中给出的地图定义具有类型Shift[U,B,C]

这里U不一定与B相同。

到目前为止,我不明白为什么不允许U与B不同 {1}在tiark的论文中给出了地图的定义。

我错过了什么,在这里无法理解?

任何提示/想法?