Functional programming 理解多提示分隔连续体的API

Functional programming 理解多提示分隔连续体的API,functional-programming,ocaml,delimited-continuations,Functional Programming,Ocaml,Delimited Continuations,本文介绍了一种用于多提示分隔连续体的API 我的问题涉及推送分包的类型:('a,'b)分包->(单元->'a)->'b。为什么这种类型不是('a,'b)subcont->'a->'b?此外,为什么分包有单独的类型:为什么不简单地('a,'b)subcont='a->'b?我几乎可以肯定这有一个很好的理由,因为Oleg使事物尽可能优雅(但不是更优雅) 谢谢 为什么不('a,'b)分包->'a->'b? 我认为这与推送提示的原因相同,因为推送提示更容易理解push_提示符p(fun()->e)直观上

本文介绍了一种用于多提示分隔连续体的API

我的问题涉及推送分包的类型:('a,'b)分包->(单元->'a)->'b。为什么这种类型不是
('a,'b)subcont->'a->'b
?此外,为什么分包有单独的类型:为什么不简单地
('a,'b)subcont='a->'b
?我几乎可以肯定这有一个很好的理由,因为Oleg使事物尽可能优雅(但不是更优雅)

谢谢

为什么不
('a,'b)分包->'a->'b
? 我认为这与推送提示的原因相同,因为推送提示更容易理解
push_提示符p(fun()->e)
直观上是一种
try e with p
的形式:提示符
p
作为处理程序放在堆栈上,并且
e
在该处理程序下运行。如果改用
push_prompt p e
,则严格的语言将首先计算参数
p
e
,并且
e
将在设置提示之前运行并“引发异常”

push_subcont sk(fun()->e)
可能有同样的问题:直观地说,这是一种“重新启动被异常中断的计算
sk
”。重要的是,
e
在计算上下文内部运行,而不是在计算上下文外部运行,例如,如果它希望引发与
sk
安装的处理程序相对应的异常

为什么不简单地
('a,'b)subcont='a->'b
? 如果只有一种方法可以重新启动子例程,那么就可以这样做:可以以函数的形式返回“pre-restarted”,当应用函数时,这些函数将使用给定的参数重新启动

但事实并非如此:本文末尾描述了具有不同语义的
push_subc
push_delim_subc
。“调用者”应该选择使用哪种重启技术。它们都需要访问子节点的内部数据,因此无法将子节点作为函数表示进行操作