我试图在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)
答案 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
。