检查一个案例中的多个条件
Checking multiple conditions in a case
假设我有这个(插入 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 的电脑上工作,所以我无法检查语法。
这是正确的语法,但您也可以稍微简化一下。
首先,观察表达式 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)