检查Int是否在BST Haskell中

时间:2018-01-21 19:48:50

标签: haskell functional-programming binary-search-tree

我试图在haskell中设计一个函数来检查一个二进制搜索树是否包含一个整数,如果确实如此,该函数将返回bool' True'。由于我正在处理BST,我对如何完成此功能非常了解,但在处理传入的整数时遇到了麻烦。我目前的大纲看起来像这样:

insideBST :: Int -> Tree -> Bool       --function receives input Int, and a tree, returns bool
insideBST (i Leaf i) = True   --base case, if function receives leaf whose int matches what was passed in to function, return True.
insideBST (i Node h l r) = if i > r then insideBST(i r)   --if i > root, inBST(r)
                       else if i < r then insideBST(i l)   --if i < root, insideBST(l)

但是我遇到第二行确定问题(i leaf i),我的目的是检查此函数中接收的int是否与leaf的int相同,如果是,则返回True。但是我在模式中得到了一个Parse错误:i,

如何正确写这个?检查收到的int是否与叶子的int匹配

-------------编辑--------------

经过一些很好的帮助后,我修复了原始代码中的明显错误:

insideBST i (Leaf z) = i == z              -- if leaf i value = int i recieved, return True
insideBST i (Node h l r) = if h.value > i then insideBST i l else if h.value < i then insideBST i r

现在我的问题是我的最后一行,我想要它,如果head的int值大于i Int值,它将调用left子树的insideBST函数,否则如果head不大于i ,它将调用正确的子树。这段代码给了我一个解析错误(可能是错误的缩进或括号不匹配) 这是我的long if声明吗?也许没有正确格式化

这是我的树声明:

数据树=节点Int树树|叶国际   派生(Eq,Show)

1 个答案:

答案 0 :(得分:3)

您的函数定义中存在一些语法错误和一个语义问题。从顶部开始,你说:

insideBST (i Leaf i) = True

这种模式毫无意义。当你有一个带有单独参数的函数时,你不能将它们组合在一个括号内。修复的语法是:

insideBST i (Leaf i) = True

......但是语义错了。你不能将i绑定到两个不同的值 - 它并不意味着&#34;这两个值是相同的&#34;就像prolog一样语言。代替:

insideBST i (Leaf l) = i == l

可以对Node的{​​{1}}行进行相同的语法修复,但您还需要修复它以使用相同的函数名称 - 您似乎已切换到insideBST ,现在我们有:

inBST

最后,您的函数应用程序只是一个空格,而不是像您一样使用的括号。因此,insideBST i (Node h l r) = ... 被解析为将函数inBST (i r)应用于参数i,然后将函数r应用于该结果。使用inBST