haskell - 检查一个案例中的多个条件
问题描述
假设我有这个(插入 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 的计算机,因此无法检查语法。
解决方案
这是正确的语法,但您也可以稍微简化一下。
首先,观察表达式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)
推荐阅读
- php - 按日期范围过滤 @json_decode 数据 php
- php - 缩短检查多个变量是否为空的方式
- docker - 如何在 Docker 容器中使用不同的用户运行 Jenkins
- ios - 在 MVVM 中的 viewController 之间传递数据
- testing - 是否可以操纵 TestCafe 在测试运行结束时总结结果的方式?
- javascript - 如何将jms消息发送到activeMQ并使用mqttJS在javascript中正确解码
- mongodb - 如何查找与 mongodb 相关的错误
- c# - 如何在 dotnet core 的不同目录中加载程序集?
- react-native - 从 Play 商店下载的 React Native 应用程序无法在 android 9 上运行
- html - 底部:0 vs 垂直对齐:底部