假设我有这个(插入BST):
mybstInsert k inp@(INode left key right)
| k < key = myNode (mybstInsert k left) key right
| k > key = myNode left key (mybstInsert k right)
我想要的是,在第二种情况下,我还需要另一个检查(检查right是否为空)。所以我想将第二个条件分解为两个条件:
| k > key && isEmpty right == True = myNode left key (mybstInsert k right)
| k > key && isEmpty right == False = myNode left key (mybstInsert k right)
假设我有一个isEmpty函数,该函数接受一个子树,并告诉我它是否为空。
推荐这样做的方法是什么?这是正确的语法吗? (我正在未安装GHCi的计算机上工作,因此无法检查语法。
答案 0 :(得分:3)
这是正确的语法,但是您也可以稍微简化一下。
首先,请注意表达式x == True
仅相当于x
。因此,您可以删除== True
。
第二,根本不需要== False
部分。这是因为到您检查该案件时,已经知道isEmpty right == False
,因为如果不是这样,您将停止上一个案件。
因此,整个事情可以这样写:
mybstInsert k inp@(INode left key right)
| k < key = myNode (mybstInsert k left) key right
| k > key && isEmpty right = myNode left key (mybstInsert k right)
| k > key = myNode left key (mybstInsert k right)
最后,我想指出您没有处理k == key
的情况,因此您的程序将在此类输入时崩溃。如果您想包括这种情况(我假设这只是一个空操作),那么您甚至不必包括k > key
支票,因为到那时为止,我们已经知道k == key
和k < key
都不正确:
mybstInsert k inp@(INode left key right)
| k == key = inp
| k < key = myNode (mybstInsert k left) key right
| isEmpty right = myNode left key (mybstInsert k right)
| otherwise = myNode left key (mybstInsert k right)