了解多提示分隔连续的API

Jul*_*les 5 ocaml functional-programming delimited-continuations

用于多提示分隔连续的API 在OCaml,Abstractly and Concretely System Description中的Delimited Control中描述.

我的问题涉及到的类型push_subcont : ('a,'b) subcont -> (unit -> 'a) -> 'b.为什么这种类型不('a,'b) subcont -> 'a -> 'b?此外,为什么有一个单独的子类型:为什么不简单('a,'b) subcont = 'a -> 'b?我几乎可以肯定这是有充分理由的,因为Oleg让事情变得尽可能优雅(但不是更优雅).

谢谢!

gas*_*che 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将运行,并设置提示之前"引发异常".

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

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

如果只有一种方法可以重新启动子连续,则可以这样做:它们可以以函数的形式返回"预重新启动",这些函数在应用时会使用给定的参数重新启动.

但事实并非如此:有push_subcontpush_delim_subcont,在文章的末尾描述,有不同的语义."调用者"应该选择使用哪种重启技术.它们都需要访问子类型的内部数据,因此它们无法对子连续作为函数表示.