5

用于多提示分隔延续的 API在 OCaml 中的分隔控制,抽象和具体系统描述一文中进行了描述

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

谢谢!

4

1 回答 1

5

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

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

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

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

如果只有一种方法可以重新启动子延续,则可以做到这一点:它们可以以“预重新启动”的形式返回,在应用时,以给定参数重新启动的函数形式。

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

于 2012-05-13T09:47:41.983 回答