如果我尝试 运行 一个简单的 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.7
和 GHC 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
我开始学习 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.7
和 GHC 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> totest
.
因此,这将导致尝试无限次地添加该整数值,因为这意味着 test
正在将
您可以定义一个新变量并使用旧树:
<strong>test2</strong> = addNode <strong>test</strong> 5