Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Don';我不懂Scala';s分隔的连续体(A@cpsParam[B,C])_Scala_Functional Programming_Types_Scala 2.8_Continuations - Fatal编程技术网

Don';我不懂Scala';s分隔的连续体(A@cpsParam[B,C])

Don';我不懂Scala';s分隔的连续体(A@cpsParam[B,C]),scala,functional-programming,types,scala-2.8,continuations,Scala,Functional Programming,Types,Scala 2.8,Continuations,我正在努力理解当一个值的类型为a@cpsParam[B,C]时,它的确切含义是什么,以及在使用分隔的continuations工具时,我应该为我的值分配什么类型的表单 我查看了一些来源: 但他们没有给我多少直觉。在最后一个环节中,作者试图给出一个明确的解释,但仍然不够清楚 这里的A表示计算的输出,也是其继续的输入。B表示该延续的返回类型,C表示其“最终”返回类型,因为shift可以对返回值进行进一步处理并更改其类型 我不理解“计算的输出”、“延续的返回类型”和“延续的最终返回类型”之间的

我正在努力理解当一个值的类型为
a@cpsParam[B,C]
时,它的确切含义是什么,以及在使用分隔的continuations工具时,我应该为我的值分配什么类型的表单

我查看了一些来源:

但他们没有给我多少直觉。在最后一个环节中,作者试图给出一个明确的解释,但仍然不够清楚

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


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

所以,其他地方的人帮我做了这个。答案如下:

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)))
})
返回
列表(“编号1”、“编号2”、“编号3”)


这里
A
Int
B
String
C
List[String]
,因为
{“number”+}
是从
Int
String
的函数,
shift
的参数,给定该函数,会生成一个
List[String]/code>,这是重置({…})
的结果,我仍在弄清楚这里涉及的确切的键入规则/含义

如果示例中的类型“足够简单”以“适合”如上所示,则看起来容易/更容易,但与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]
,根据蒂亚克论文中给出的map定义

这里U不一定与B相同

到目前为止,我不明白为什么没有类似的东西,U可以与B不同
U当人们看不到我的博客帖子时,我总是很难过:我详细介绍了这一点,因为这让我在查看互联网上的现有资源时感到非常沮丧。谢谢Josh,我将查看你的帖子。