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

问题描述 投票:0回答:2

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

但是出现编译错误

haskell
2个回答
3
投票

如果您具有布尔表达式(条件),而不是实际模式,则需要使用防护。

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”,但需要扩展。


1
投票

A case expression [Haskell-report]处理模式。像case这样的表达式是not模式。

我建议定义一个辅助函数,并使用guards

n `mod` 2 /= 0

[在tmp :: Int -> String tmp n | n `mod` 2 /= 0 = "Weird" | n >= 2 && N <= 5 = "Not Weird" | n >= 6 && N <= 20 = "Weird" | n > 20 = "Not Weird" | otherwise = …otherwise的情况下,您仍然需要为n == 1的情况定义一个值。

然后我们可以将其用于:

n < 0
© www.soinside.com 2019 - 2024. All rights reserved.