代码之家  ›  专栏  ›  技术社区  ›  SilentDev

检查案例中的多个条件

  •  -1
  • SilentDev  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Fyodor Soikin    7 年前

    这是正确的语法,但您也可以将其简化一点。

    首先,观察表达式 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==键 也没有 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)
    
    推荐文章