Ocaml 指向自身的函数

Ocaml 指向自身的函数,ocaml,Ocaml,我在第106页的以下例子中迷失了方向,这本书的标题是《使用目标骆驼开发应用程序》 let nil_assoc = function x -> raise Not found ; ; let l = ref nil_assoc;; let add_assoc_again (k,v) l = l := (function x -> if x=k then v else !l x) ; ; add_assoc_again ('1',1) l ; ; add_assoc_again ('2'

我在第106页的以下例子中迷失了方向,这本书的标题是《使用目标骆驼开发应用程序》

let nil_assoc = function x -> raise Not found ; ;
let l = ref nil_assoc;;
let add_assoc_again (k,v) l = l := (function x -> if x=k then v else !l x) ; ;
add_assoc_again ('1',1) l ; ;
add_assoc_again ('2',2) l ; ;
l的结果值是指向自身的函数,因此循环

我本以为l的值在加上“1”,1L;;是 作用

x -> if x = '1' then 1 else nil_assoc x;;
x -> if x ='2' then 2 else ( function x -> if x = '1' then 1 else nil_assoc x ) x;;
在续文中,再次添加“2”,2 l;”后l的结果值;;应该是 作用

x -> if x = '1' then 1 else nil_assoc x;;
x -> if x ='2' then 2 else ( function x -> if x = '1' then 1 else nil_assoc x ) x;;

我不明白为什么l的结果值是指向自身的函数,因此程序挂起并循环

!当您再次调用add_assoc_时,不会对l求值,而是在您调用该调用创建的函数时对l求值。在这一点上,我将指向这个函数,这就是为什么你会得到无限循环。

在新书中,这段代码有一个稍微修改过的版本,在我看来更清楚:

let nil_assoc = function x -> raise Not_found ;;
let add_assoc (k,v) l = function x -> if x = k then v else l x ;;
val add_assoc : 'a * 'b -> ('a -> 'b) -> 'a -> 'b = <fun>
这里,l1相当于fun x->如果x=1,则1 else nil_assoc x

l2是有趣的x->如果x=2,那么2个其他有趣的y->如果y=1,那么1个其他无关联的y 2


与您所使用的版本相比,这非常容易理解。

现在这是一些创造性的格式。。。我必须假设这是故意的=/