[英]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.