gpt4 book ai didi

Haskell,如何用 case-of 语句替换嵌套的 if?

转载 作者:行者123 更新时间:2023-12-05 08:51:38 24 4
gpt4 key购买 nike

我开始学习 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)

最佳答案

如果您有 bool 表达式(条件)而不是实际模式,则需要使用守卫。

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”也可以用作替代方案,但它需要扩展。

关于Haskell,如何用 case-of 语句替换嵌套的 if?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com