我正在尝试编写一种验证算法,以使树满足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
帮助您生成任意(模糊的)数据以测试程序的属性(属性测试) )。