我正在阅读这个有趣的页面,解释球拍中的延续.
它们呈现代码以保存当前的计算延续(并在稍后使用此技巧来实现回溯).代码如下:
(define (currcc)
(call/cc (lambda (cc) (cc cc))))
Run Code Online (Sandbox Code Playgroud)
现在我想在标准ML中做同样的技巧,因为新泽西的SML似乎是实现延续的唯一解释器,我在那里做.
那里的延续签名如下:
type 'a cont
val callcc : ('a cont -> 'a) -> 'a
val throw : 'a cont -> 'a -> 'b
val isolate : ('a -> unit) -> 'a cont
Run Code Online (Sandbox Code Playgroud)
直接翻译将是:
val currcc () = callcc (fn cc => throw cc cc)
Run Code Online (Sandbox Code Playgroud)
但ML的类型系统禁止这个(因为这是循环的).
所以我尝试了类似的东西:
val glcc = ref (isolate (fn x => ()) : unit cont)
fun savecc () = (callcc (fn (cc : unit …Run Code Online (Sandbox Code Playgroud)