algorithm - 如何在 Haskell 中调试 BST 验证算法?

标签 algorithm haskell binary-search-tree

我正在尝试编写一个树满足 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/

相关文章:

r - 在图论中解释社区结构

c - 如何从链接列表中删除循环

algorithm - 最小的封闭正六边形

haskell - 如何在 Haskell 的列表理解中有条件地模式匹配

c++ - 恢复一个二元错位二叉搜索树

c++ - 二叉搜索树上的范围查询(递归)

algorithm - 有向图 - 不可达节点

Haskell:图 ADT 的重载 ==

haskell - 测试函数的类型

ruby - RB树插入顺序敏感性