我正在实现BST的插入功能,下面是我的代码:
data Tree a = Empty
| Node Integer (Tree a) a (Tree a)
deriving (Show, Eq)
treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x Empty = Node 0 Empty x Empty
treeInsert x (Node height left a right)
| x == a = Node height left x right
| x < a = Node height (treeInsert x left) a right
| x > a = Node height left a (treeInsert x right)
当我使用我的代码时,它不会做任何事情,就像重复周期仍在工作一样
tree = foldTree [1, 2, 3]
tree
=> Node 1 (Node 0 Empty 2 Empty) 3 (Node 0 Empty 1 Empty)
tree = treeInsert 4 tree
tree
我是哈斯克尔的新手,有人可以帮忙吗?多谢。
通过编写tree = treeInsert 4 tree
,您可以定义一个名为tree
的新变量,该变量以自身 trems 的形式定义。在Haskell中,所有变量都是不可变的,这意味着一旦tree
被赋值,你就不能给它赋值。您可以做的是定义一个具有相同名称的新变量,但随后tree = …
正文中的tree
引用自身。
因此,您可以使用一个新变量:
tree2= treeInsert 4 tree
例如:
Prelude> tree = Node 1 (Node 0 Empty 2 Empty) 3 (Node 0 Empty 1 Empty)
Prelude> tree2 = treeInsert 4 tree
Prelude> tree2
Node 1 (Node 0 Empty 2 Empty) 3 (Node 0 Empty 1 (Node 0 Empty 4 Empty))
但是,看起来节点的"高度"没有正确更新。
在 Haskell 中,使用变量本身并不少见,例如,您可以使用以下内容制作无限的零列表:
zeros= (0:zeros)