一次检查多个条件

时间:2019-02-05 03:08:06

标签: haskell ghc ghci

假设我有这个(插入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的计算机上工作,因此无法检查语法。

1 个答案:

答案 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 == keyk < 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)