【问题标题】:Understanding the API of multi-prompt delimited continuations了解多提示分隔延续的 API
【发布时间】:2012-05-21 01:28:42
【问题描述】:

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?我几乎可以肯定这是有充分理由的,因为 Oleg 使事情尽可能优雅(但不是更优雅)。

谢谢!

【问题讨论】:

    标签: functional-programming ocaml delimited-continuations


    【解决方案1】:

    为什么不('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 具有不同的语义。 “调用者”应该选择使用哪种重启技术。它们都需要访问子连续的内部数据,因此它们无法对子连续作为函数表示进行操作。

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2011-08-25
      • 2011-08-29
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多