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

09-11 16:47