我很难理解当值具有类型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可以对返回值进行进一步处理并更改其类型。
我不明白“计算的输出”,“延续的返回类型”和“延续的最终返回类型”之间的区别。它们听起来像是同义词。
答案 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")
。
此处A
为Int
,B
为String
,C
为List[String]
,因为{"number" + _}
为(此处)a从Int
到String
的函数以及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的论文中给出了地图的定义。
我错过了什么,在这里无法理解?
任何提示/想法?