不理解Scala分界延续的类型(A @cpsParam[B,C])

23

我很难理解当一个值具有类型 A @cpsParam[B,C] 时到底意味着什么,以及在使用限定的continuations工具时应该给我的值分配哪些形式的类型。

我查看了一些资料:

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表示计算的输出,也是它的continuation的输入。B表示该continuation的返回类型,C表示其“最终”返回类型——因为shift可以进一步处理返回值并更改其类型。

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


2
当人们无法看到我的博客文章时,我总是感到很难过:http://suereth.blogspot.com/2010/03/how-you-should-think-about-delimited.html我详细地介绍了这个问题,因为在查看现有的互联网资源时,这是令我非常沮丧的事情。 - jsuereth
谢谢Josh,我会看看你的帖子。 - jkff
2个回答

21

所以,其他人已经帮我解决了这个问题。以下是答案:

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" + _} 在这里是一个从 IntString 的函数,而给定该函数的参数作为 shift 的参数,则生成一个 List[String],成为 reset({...}) 的结果。


1

我仍在努力弄清楚此处涉及的精确类型规则/含义。

如果示例中的类型“足够简单”并且“匹配良好”,似乎很容易/更容易,但是与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不同。

我错过了什么或者在这里理解失败了吗?

有什么提示/想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接