小编Yan*_*ter的帖子

将当前延续保存在SMLofNJ中

我正在阅读这个有趣的页面,解释球拍中的延续.

它们呈现代码以保存当前的计算延续(并在稍后使用此技巧来实现回溯).代码如下:

(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)

callcc smlnj

6
推荐指数
0
解决办法
197
查看次数

标签 统计

callcc ×1

smlnj ×1