【问题标题】:GHCI infinite loop in Binary Search Tree [duplicate]二叉搜索树中的GHCI无限循环[重复]
【发布时间】: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 实现中编码错误?

【问题讨论】:

    标签: haskell ghci


    【解决方案1】:

    关于你的树的所有这些东西都与这里的根本原因无关,即 haskell 的 = 不是赋值运算符,而是一个定义。重要的是,它允许递归,允许一个值引用自身,例如xs = 1 : xs 产生一个无限的 1 列表。

    因此,您不是通过三个插入逐步构建一棵树,而是定义了三棵不相关的树,每棵树都是自引用的,因此是循环的。如果你只是写x = x,你也会遇到同样的问题。

    如果您想为计算中的步骤命名,则必须为每个步骤指定不同的名称,因为您无法修改现有绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多