用于多提示分隔延续的 API在 OCaml 中的分隔控制,抽象和具体系统描述一文中进行了描述。
我的问题涉及push_subcont : ('a,'b) subcont -> (unit -> 'a) -> 'b
. 为什么不是这种类型('a,'b) subcont -> 'a -> 'b
?此外,为什么子控件有单独的类型:为什么不简单('a,'b) subcont = 'a -> 'b
?我几乎可以肯定这是有充分理由的,因为 Oleg 使事情尽可能优雅(但不是更优雅)。
谢谢!
用于多提示分隔延续的 API在 OCaml 中的分隔控制,抽象和具体系统描述一文中进行了描述。
我的问题涉及push_subcont : ('a,'b) subcont -> (unit -> 'a) -> 'b
. 为什么不是这种类型('a,'b) subcont -> 'a -> 'b
?此外,为什么子控件有单独的类型:为什么不简单('a,'b) subcont = 'a -> 'b
?我几乎可以肯定这是有充分理由的,因为 Oleg 使事情尽可能优雅(但不是更优雅)。
谢谢!
('a,'b) subcont -> 'a -> 'b
呢?我认为这与 for 的原因相同push_prompt
——这更容易理解。push_prompt 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
呢?如果只有一种方法可以重新启动子延续,则可以做到这一点:它们可以以“预重新启动”的形式返回,在应用时,以给定参数重新启动的函数形式。
但事实并非如此:文章末尾描述的push_subcont
and具有不同的语义。push_delim_subcont
“调用者”应该选择使用哪种重启技术。它们都需要访问子连续的内部数据,因此它们无法对子连续作为函数表示进行操作。