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,我将查看你的帖子。