簡體   English   中英

Haskell插入到特定樹中

[英]Haskell inserting into a specific tree

我在haskell中執行樹時遇到以下問題。 我的數據類型正確,並且插入和搜索方法有效。 但是,在測試方面我非常有限。 例如,如果我在代碼中聲明一棵樹,說testtree並給它一些值,那么當嘗試插入testree它實際上不會更新testree。 請允許我解釋一下。 如果我在ghci窗口中聲明insert 5 testtree ,它會返回一個新樹,它就是testree,將5添加到正確的位置。 快樂的時光。 如果我嘗試將其他元素添加到testree中,它將返回原始testree與添加的新元素相同的內容。 5人消失了。 所以問題是我不能改變睾丸的原始實例,這是一個痛苦的屁股。 測試我的insert方法的步驟包括創建許多樹,這些樹涵蓋了向其中添加元素的所有可能性。 如果我只有一棵樹可以繼續添加,那將更加方便。 任何幫助將非常感激! 這是一個突出我的問題的示例,我正在實施的它的2-3-4樹因此已從中取出很多代碼,因為不需要它來突出問題。

data Tree t =   Empty 
                | Root1 t (Tree t)(Tree t) 
                | Root2 t t (Tree t)(Tree t)(Tree t)
                deriving (Eq, Ord, Show)

leaf1 x = Root1 x  (Empty) (Empty)
leaf2 x y = Root2 x y (Empty) (Empty) (Empty)

insert :: Ord t => t -> Tree t -> Tree t
insert t Empty = leaf1 t
insert t (Root1 a Empty Empty)
          | t <= a = leaf2 t a
          | otherwise = leaf2 a t

insert t (Root1 a left right)
          | t <= a = Root1 a (insert t(left)) (right)
          | otherwise = Root1 a (left) (insert t(right))

testtree = Root1 5 (Root1 3 (Empty) (Empty)) (Root1 7 (Empty) (Empty))

歡迎來到持久數據結構的美好世界。 持久性數據結構的基本定義特征是所有更新都是非破壞性的。 您不能更改數據結構,只能將其用作新結構的基礎。

事實證明,這在代碼維護,並行代碼的性能以及並發代碼的正確性方面具有巨大的優勢。 這是一件好事。

Haskell值是不可變的。 定義testtree = ... ,無法更改testtree的值。

相反,您必須執行以下操作:

tree1 = insert 5 testtree
tree2 = insert 6 tree1
tree3 = insert 7 tree2
...

請注意,如果您嘗試:

testtree = insert 5 testtree

你只是進入一個無限循環的testtree在RHS指的是同testtree正在定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM