我正在尝试编写一个树满足 BST 属性的验证算法,并询问我的代码中的一个错误。
data Tree x = Leaf x | Node x (Tree x) (Tree x)
deriving (Show)
window :: Int -> Int -> Int -> Bool
window min max x = min <= x && x <= max
bstHelper :: Int -> Int -> Tree Int -> Bool
bstHelper min max (Leaf x) = window min max x
bstHelper min max (Node x t1 t2) = (window min max x) && (bstHelper min x t1) && (bstHelper x max t1)
x1 = bstHelper 3 6 (Node 5 (Leaf 3) (Leaf 6))
x2 = (window 3 6 5) && (bstHelper 3 5 (Leaf 3)) && (bstHelper 5 6 (Leaf 6))
wrong = x1 == x2
为什么错是假的?
你会如何亲自调试这个?
最佳答案
修复代码的解决方案在问题下方的评论中,使用 t2
在最后一部分:(bstHelper max x t2)
.如果你用 -Wall
编译它可能会告诉您有一个未使用的参数 t2
.如果你在 Haskell 中命名一个值并且不使用它,编译器会报错。如果你想命名一个值而不使用它,那么你应该在名称前加上 _
.
最后,关于如何在 Haskell 中进行调试的一些技巧。如果它正在编译并且没有警告,请将其加载到 GHCi 和 bstHelper
举几个例子,看看它是否像你期望的那样工作。然后下一步是设置测试,看看这些库:hspec
一个测试库(只有这个你可以进行单元测试),QuickCheck
帮助您生成任意(模糊)数据来测试程序的属性(属性测试)。
关于algorithm - 如何在 Haskell 中调试 BST 验证算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921963/