【发布时间】:2017-09-27 19:06:02
【问题描述】:
我在 Haskell 中有一个二叉搜索树的实现
data BST = Nil | Node (BST) Int (BST) deriving Show
emptyTree :: BST
emptyTree = Nil
isEmptyTree :: BST -> Bool
isEmptyTree Nil = True
isEmptyTree _ = False
leftChild :: BST -> BST
leftChild Nil = Nil
leftChild (Node l k r) = l
rightChild :: BST -> BST
rightChild Nil = Nil
rightChild (Node l k r) = r
root :: BST -> Int
root Nil = error "Empty Tree"
root (Node l k r) = k
insert_r :: BST -> Int -> BST
insert_r Nil k = Node Nil k Nil
insert_r n@(Node l x r) k
| k < x = Node (insert_r l k) x r
| k > x = Node l x (insert_r r k)
| otherwise = n
我正在尝试在树中插入一些值来测试它。这是一个示例测试序列:
t = Nil
t = insert_r t 2
t = insert_r t 3
t = insert_r t 1
当我尝试在 GHCi 中运行它时,在检查“t”值的那一刻,我得到一个无限循环。 但是,如果我将每次插入的结果分配给一个新变量,如下所示:
v = insert_r t 2
u = insert_r v 1
检查“u”的值非常有效。这是否与 Haskell 的惰性评估有关,还是我在 BST 实现中编码错误?
【问题讨论】: