haskell - Haskell,如何用 case-of 语句替换嵌套的 if?
问题描述
我开始学习haskell,我正在解决一些简单的编程挑战。所以我现在的问题只是根据传递的值打印一些文本:
main = do
n <- readLn :: IO Int
if n `mod` 2 > 0
then putStrLn "Weird"
else if n > 1 && n < 6
then putStrLn "Not Weird"
else if n > 5 && n < 21
then putStrLn "Weird"
else putStrLn "Not Weird"
但是我认为这相当难看,有没有办法可以用更优雅的模式匹配替换嵌套的 if 结构?
我试过了:
main :: IO()
main = do
n <- readLn :: IO Int
case n of
n `mod` 2 /= 0 -> putStrLn "Weird"
n >= 2 && N <= 5 -> putStrLn "Not Weird"
n >= 6 && N <= 20 -> putStrLn "Weird"
n > 20 -> putStrLn "Not Weird"
但我得到一个编译错误。
编辑:最终解决方案
check :: Int -> String
check n
| (n `mod` 2 /= 0) = "Weird"
| (n >= 2) && (n <= 5) = "Not Weird"
| (n >= 6) && (n <= 20) = "Weird"
| otherwise = "Not Weird"
main :: IO()
main = do
n <- readLn :: IO Int
putStrLn (check n)
解决方案
如果您有布尔表达式(条件)而不是实际模式,则需要使用警卫。
main :: IO()
main = do
n <- readLn :: IO Int
case () of
_ | n `mod` 2 /= 0 -> putStrLn "Weird"
| n >= 2 && n <= 5 -> putStrLn "Not Weird"
| n >= 6 && n <= 20 -> putStrLn "Weird"
| n > 20 -> putStrLn "Not Weird"
考虑otherwise
在最后一种情况下使用:假设您想捕获其他所有内容,它会更快并抑制有关非穷举性的 GHC 警告。
“multiway if”也可以用作替代方案,但它需要扩展。
推荐阅读
- express - 猫鼬/快递无法读取未定义的属性“unshift”
- javascript - 有没有办法生成唯一 id 并将数据从 php 传递到 javascript 以供我计算?
- javascript - 检查选择文本,如果超过 3 个选项,则隐藏包含文本的选项,并在第一次选择时更改文本以无选项
- python-3.x - 调用 xlwings 函数的线程返回 pywintype 错误
- java - 将行附加到矩阵的最佳方法是什么?
- python - Pandas 将列名从一个数据框复制到另一个数据框
- rust - Rust - 由于需求冲突,无法为 autoref 推断出合适的生命周期
- opencl - 如何监控 OpenCL 主机代码的运行时行为
- java - 将 Java 转换为 Python - 将属性值转换为字符串
- c# - 哪个是使用数据库上下文存储库模式的最佳代码?