我正在阅读这个有趣的页面,解释球拍中的延续。
他们提供代码来保存计算的当前延续(稍后使用这个技巧来实现回溯)。代码如下所示:
(define (currcc)
(call/cc (lambda (cc) (cc cc))))
现在我想在标准 ML 中做同样的事情,因为新泽西州的 SML 似乎是唯一实现延续的解释器,所以我在那里做。
那里的延续签名如下所示:
type 'a cont
val callcc : ('a cont -> 'a) -> 'a
val throw : 'a cont -> 'a -> 'b
val isolate : ('a -> unit) -> 'a cont
直接翻译是:
val currcc () = callcc (fn cc => throw cc cc)
但是 ML 的类型系统禁止这样做(因为这是循环的)。
所以我尝试了类似的东西:
val glcc = ref (isolate (fn x => ()) : unit cont)
fun savecc () = (callcc (fn (cc : unit cont) => glcc := cc); !glcc)
fun backjump () = throw (!glcc) ();
以及其他各种带有引用的技巧,但我找不到真正保存当前延续的方法(因为在此示例中,我之后使用 !glcc 更改了想要的延续)。
有谁知道实现运算符的方法savecc
,backjump
让我保存程序的当前延续,然后在标准 ML 中跳回到那个点?
提前谢谢了!
雅尼克