OCaml堆缺少节点

OCaml堆缺少节点,ocaml,heap,Ocaml,Heap,我已经定义了一个类型堆: type 'a heap = | Node of int * int * 'a heap * 'a heap | Leaf;; 以及以下功能: let rank = function Leaf -> 0 | Node (r,_,_,_) -> r;; let makeNode x a b = if rank a>= rank b then Node(rank b+1,x,a,b) else Node (rank a+1,x,a,b);; le

我已经定义了一个类型堆:

type 'a heap = 
| Node of int * int * 'a heap * 'a heap
| Leaf;;
以及以下功能:

let rank = function Leaf -> 0 | Node (r,_,_,_) -> r;;

let makeNode x a b = 
if rank a>= rank b then Node(rank b+1,x,a,b)
else Node (rank a+1,x,a,b);;

let rec meld  = function
|h,Leaf | Leaf,h -> h
| (Node(f,x,a1,b1)as h1),(Node(g,y,a2,b2)as h2) -> if  x >= y then makeNode x a1 (meld (b1, h2))
else makeNode y a2 (meld (h1, b2));;

let insert h x = meld ((Node(1,x,Leaf,Leaf)), h);;
但是,当我在堆中插入第二个节点时,根节点消失了。如何解决此问题:

let makeheap x = Node(1,x,Leaf,Leaf);;   
let myheap = makeheap 5;;
insert myheap 7;;
insert myheap 8;;
insert myheap 3;;
结果如下:

val myheap : 'a heap = Node(1,5,Leaf,Leaf)
'a heap = Node(1,7,Leaf,Node(1,5,Leaf,Leaf))
'a heap = Node (1,8,Leaf,Node(1,5,Leaf,Leaf))
'a heap = Node(1,5,Leaf,Node(1,3,Leaf,Leaf))

您正在调用
insert
,就好像它是一个命令函数一样。也就是说,好像它要改变某种状态。但是您的数据结构是不变的。您必须将
insert
视为返回新状态

我想,在做得太深入之前,你应该仔细阅读纯函数式编程

冈崎纯功能数据结构的前几章解释得很好

你眼前问题的答案是这样的:

# insert (insert myheap 7) 8;;
- : 'a heap = Node (1, 8, Leaf, Node (1, 7, Leaf, Node (1, 5, Leaf, Leaf)))

您正在调用
insert
,就好像它是一个命令函数一样。也就是说,好像它要改变某种状态。但是您的数据结构是不变的。您必须将
insert
视为返回新状态

我想,在做得太深入之前,你应该仔细阅读纯函数式编程

冈崎纯功能数据结构的前几章解释得很好

你眼前问题的答案是这样的:

# insert (insert myheap 7) 8;;
- : 'a heap = Node (1, 8, Leaf, Node (1, 7, Leaf, Node (1, 5, Leaf, Leaf)))