如果我尝试 运行 一个简单的 binTree,GHCi 会冻结

GHCi freezes if I try to run a simple binTree

我开始学习 Haskell 作为一门新语言只是因为我可以。作为练习,我尝试编写一个简单的 BinTree,但我 运行 遇到了一个非常令人气愤的错误。

这是我遇到问题的源代码:


data Tree = Node Tree Int Tree
    | Empty
    deriving (Eq,Show)
    
addNode :: Tree -> Int -> Tree
addNode Empty a = Node Empty a Empty
addNode (Node left a right) b   | a > b = Node (addNode left b) a right
                                | a < b = Node left a (addNode right b)
                                | otherwise = Node left b right

注意:我尝试 运行使用 GHC 8.10.7GHC 9.2.1 编译代码,但无济于事。

问题发生在我尝试 运行 addNode 空 binTree test 时。 使用 test = Empty 创建空的 binTree 并仅使用 test 检查它效果很好,结果给我 Empty,但是如果我随后尝试添加一个节点以使用 [=19 进行测试=] 并尝试向我显示结果 test 没有任何反应。编译器正在尝试 运行 代码,但它只是冻结,我必须重新打开 PowerShell。

如果有帮助,这是我当前的设置:

GHC 9.2.1 | 8.10.7 cabal 3.6.2.0 HLS 1.5.1 Stack 2.7.3 OS Win10

通过 运行 test = addNode test 5,您将无限次地继续添加 5。它不带“旧”test。在 Haskell 中,变量始终是不可变的,如果您在定义的“正文”中使用 test,那么它将使用您正在定义的变量。因此它作为 recursive let statement [wiki].

这里意味着你将test定义为:

let test be the result of adding <Int> to test.

因此,这将导致尝试无限次地添加该整数值,因为这意味着 test 正在将 添加到已添加 的树中,该树已添加 Int> 那个……

您可以定义一个新变量并使用旧树:

<strong>test2</strong> = addNode <strong>test</strong> 5