我开始学习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"
但是出现编译错误
如果您具有布尔表达式(条件),而不是实际模式,则需要使用防护。
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”,但需要扩展。
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