检查的情况下的多个条件

问题描述 投票:-1回答:1

假设我有这个(插入到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所以我不能检查语法的计算机上。

haskell ghc ghci
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.