【问题标题】:How do you debug a BST verification algorithm in Haskell?如何在 Haskell 中调试 BST 验证算法?
【发布时间】:2020-03-14 06:13:39
【问题描述】:

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

为什么错是假的?
你会如何亲自调试这个?

【问题讨论】:

  • 您在第二次递归调用中使用了t1,而不是t2,作为bstHelper 的最后一个参数。
  • 启用警告,它会报告未使用的t2。强烈推荐。
  • 使用-Wall 编译可能会有所帮助。 GHC 编译器可以检查一定数量的东西,并且经常会警告您代码中的“奇怪”元素。

标签: algorithm haskell binary-search-tree


【解决方案1】:

修复代码的解决方案在问题下方的 cmets 中,在最后一部分使用 t2(bstHelper max x t2)。如果您使用-Wall 编译,它可能会告诉您您有一个未使用的参数t2。如果你在 Haskell 中命名一个值并且不使用它,编译器会报错。如果你想命名一个值而不使用它,那么你应该在名称前加上_

最后,关于如何在 Haskell 中进行调试的一些技巧。如果它正在编译并且没有警告,请将其加载到 GHCi 和 bstHelper 中,以查看它是否按预期工作。然后下一步是设置测试,看看这些库:hspec 一个测试库(只有这个你可以进行单元测试),QuickCheck 帮助你生成任意(模糊)数据来测试一个属性程序(属性测试)。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多