了解多提示分隔连续的API

时间:2012-05-13 00:35:24

标签: functional-programming ocaml delimited-continuations

文章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?我几乎可以肯定这是有充分理由的,因为奥列格让事情变得尽可能优雅(但不是更优雅)。

谢谢!

1 个答案:

答案 0 :(得分:5)

为什么不('a,'b) subcont -> 'a -> 'b

我认为这与push_prompt的原因相同 - 这更容易理解。 push_prompt p (fun () -> e)直观地是try e with p的一种形式:提示符p作为处理程序放在堆栈上,e在此处理程序下运行。如果您使用了push_prompt p e,则严格的语言会首先评估参数pe,并且e会在设置提示之前运行并“引发异常”。< / p>

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

为什么不简单地('a,'b) subcont = 'a -> 'b

如果只有一种方法可以重新启动子连续,那么可以这样做:它们可以以函数的形式返回“预重启”,当应用时,将使用给定的参数重新启动。

但事实并非如此:文章末尾描述的push_subcontpush_delim_subcont具有不同的语义。 “调用者”应该选择使用哪种重启技术。他们都需要访问子类型的内部数据,因此他们无法对subcontinuation-as-function表示进行操作。