首页 > 解决方案 > 检查一个案例中的多个条件

问题描述

假设我有这个(插入 BST):

mybstInsert k inp@(INode left key right)
    | k < key = myNode (mybstInsert k left) key right
    | k > key = myNode left key (mybstInsert k 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 的计算机,因此无法检查语法。

标签: haskellghcghci

解决方案


这是正确的语法,但您也可以稍微简化一下。

首先,观察表达式x == True等价于 just 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)

推荐阅读