OCaml的堆缺少的节点
问题描述:
我已经定义了类型堆:OCaml的堆缺少的节点
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)))