文章Delimited Control in OCaml, Abstractly and Concretely System Description中描述了用于多提示分隔延续的API。
我的问题涉及push_subcont : ('a,'b) subcont -> (unit -> 'a) -> 'b
的类型。为什么这种类型不是('a,'b) subcont -> 'a -> 'b
?此外,为什么有一个单独的子类型:为什么不简单('a,'b) subcont = 'a -> 'b
?我几乎可以肯定这是有充分理由的,因为奥列格让事情变得尽可能优雅(但不是更优雅)。
谢谢!
答案 0 :(得分:5)
('a,'b) subcont -> 'a -> 'b
?我认为这与push_prompt
的原因相同 - 这更容易理解。 push_prompt p (fun () -> e)
直观地是try e with p
的一种形式:提示符p
作为处理程序放在堆栈上,e
在此处理程序下运行。如果您使用了push_prompt p e
,则严格的语言会首先评估参数p
和e
,并且e
会在设置提示之前运行并“引发异常”。< / p>
push_subcont sk (fun () -> e)
可能会遇到同样的问题:它是一种直观的“重新启动被异常中断的计算sk
”。重要的是e
在计算的上下文中运行,而不是在它之外运行,例如,如果它希望引发与sk
安装的处理程序相对应的异常。
('a,'b) subcont = 'a -> 'b
?如果只有一种方法可以重新启动子连续,那么可以这样做:它们可以以函数的形式返回“预重启”,当应用时,将使用给定的参数重新启动。
但事实并非如此:文章末尾描述的push_subcont
和push_delim_subcont
具有不同的语义。 “调用者”应该选择使用哪种重启技术。他们都需要访问子类型的内部数据,因此他们无法对subcontinuation-as-function表示进行操作。