22

我正在努力理解当一个值具有类型时它的确切含义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 可以对返回值进行进一步处理并更改其类型。

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

4

2 回答 2

20

因此,人们在其他地方帮助我解决了这个问题。这是答案:

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

因此,在 type的计算中是 typeshift的一个洞。的参数返回一个 type 的值,这就是为什么有 type 。A{...}BshiftCreset ({...})C

理解这些东西的关键技巧是看到它{...}并根据' 的参数返回的类型而reset {...}具有不同的类型。shift

例如:

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

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

这里Ais Int, Bis String, CisList[String]因为{"number" + _}is (here) 一个函数 from InttoString和 的参数shift,给定该函数,产生 a List[String],它成为 的结果reset({...})

于 2010-03-14T05:46:48.933 回答
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|]} )将具有Shift[U,B,C]根据tiark论文中给出的map定义的类型。

这里 U 不一定与 B 相同。

到目前为止,我不明白为什么允许 U 与 B 不同,而没有像 U <: Btiark 论文中的 map 定义中给出的那样。

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

任何提示/想法?

于 2010-11-16T17:04:57.200 回答