Haskell,如何用语句的大小写替换嵌套if?
我开始学习haskell,我正在解决一些简单的编程挑战。所以我现在的问题是根据传递的值打印一些文本:Haskell,如何用语句的大小写替换嵌套if?,haskell,Haskell,我开始学习haskell,我正在解决一些简单的编程挑战。所以我现在的问题是根据传递的值打印一些文本: main=do n0 然后说“奇怪” 否则,如果n>1&&n5&&n=2&&n putStrLn“不奇怪” n>=6&&n putStrLn“怪异” n>20->putStrLn“不奇怪” 但是我得到了一个编译错误 编辑:最终解决方案 check::Int->String 支票 |(n`mod`2/=0)=“怪异” |(n>=2)&&(n=6)&&(n如果有布尔表达式(条件),则需要使用保护,
main=do
n0
然后说“奇怪”
否则,如果n>1&&n<6
然后putStrLn“不奇怪”
否则,如果n>5&&n<21
然后说“奇怪”
否则putStrLn“不奇怪”
然而,我认为这是相当丑陋的,有没有什么方法可以用更优雅的模式匹配替换嵌套的if结构
我试过:
main::IO()
main=do
n putStrLn“怪异”
n>=2&&n putStrLn“不奇怪”
n>=6&&n putStrLn“怪异”
n>20->putStrLn“不奇怪”
但是我得到了一个编译错误
编辑:最终解决方案
check::Int->String
支票
|(n`mod`2/=0)=“怪异”
|(n>=2)&&(n=6)&&(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"
main::IO()
main=do
n putStrLn“怪异”
|n>=2&&n putStrLn“不奇怪”
|n>=6&&n putStrLn“怪异”
|n>20->putStrLn“不奇怪”
在最后一种情况下,考虑使用否则
:假设您想要捕获其他所有内容,它会更快并抑制GHC关于非穷尽性的警告
“多路if”也可用作替代,但它需要一个扩展。如果您有布尔表达式(条件),而不是实际模式,则需要使用保护
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"
main::IO()
main=do
n putStrLn“怪异”
|n>=2&&n putStrLn“不奇怪”
|n>=6&&n putStrLn“怪异”
|n>20->putStrLn“不奇怪”
在最后一种情况下,考虑使用否则
:假设您想要捕获其他所有内容,它会更快并抑制GHC关于非穷尽性的警告
“多路if”也可用作替代,但它需要扩展。A处理模式。类似n`mod`2/=0的表达式不是模式
我建议定义一个helper函数,并使用guards:
A处理模式。像n`mod`2/=0
这样的表达式不是模式
我建议定义一个helper函数,并使用guards:
chi的回答中提到了“多路if”,但没有解释,我认为了解这种情况很有用。启用(例如,通过在文件顶部编写{-#LANGUAGE MultiWayIf}
)允许您编写
if | (n `mod` 2 /= 0) -> putStrLn "Weird"
| (n >= 2) && (n <= 5) -> putStrLn "Not Weird"
| (n >= 6) && (n <= 20) -> putStrLn "Weird"
| otherwise -> putStrLn "Not Weird"
if |(n`mod`2/=0)->putStrLn“怪异”
|(n>=2)和(n)不奇怪
|(n>=6)和(n)putStrLn“怪异”
|否则->putStrLn“不奇怪”
chi的回答中提到了“多路如果”,但没有解释,我认为了解这种情况很有用。启用(例如,通过在文件顶部编写{-#语言多路如果#-}
可以让您编写
if | (n `mod` 2 /= 0) -> putStrLn "Weird"
| (n >= 2) && (n <= 5) -> putStrLn "Not Weird"
| (n >= 6) && (n <= 20) -> putStrLn "Weird"
| otherwise -> putStrLn "Not Weird"
if |(n`mod`2/=0)->putStrLn“怪异”
|(n>=2)和(n)不奇怪
|(n>=6)和(n)putStrLn“怪异”
|否则->putStrLn“不奇怪”
case
期望模式,n`mod`2/=0
等都不是模式。对,那么怎么做呢?守卫?putStrLn$如果奇数n | | in范围(6,20)n,那么“奇怪”或者“不奇怪”
@DanielWagner尽管你的版本较短,但我的目标不是找出最短的版本,而是要理解if..else
语句、guards
和case..of
case
期望模式、n`mod`2/=0
等不是模式之间的区别。对吗你能这样做吗?警卫?如果奇n | | | in范围(6,20)n那么“奇怪”其他“不奇怪”
@DanielWagner尽管你的版本较短,但我的目标不是找出尽可能短的版本,而是要理解if..else
语句、guards
和case..of
n==1之间的区别,这是一个奇数,但我用u-an替换了其他语句d抛出一个错误,你知道为什么会这样吗?@OscarFranco:你不能写,否则=
,因为Haskell需要一个字符串。因此你需要指定一个字符串,比如“怪异”
。不,我写了|=“怪异”
,因为我知道了u是有效的identifier@OscarFranco:no。
是一种模式:)。所以你不能在守卫中使用它。这需要类型为Bool
的表达式。事实上否则
只是True
的别名。n==1应该被第一个情况捕获,它是奇数,但我用u替换了它。并且抛出了一个错误,你知道为什么会这样吗?@OscarFranco:你不能写否则=
,因为Haskell需要一个字符串。因此,您需要指定一个字符串,例如“怪异”
。不,我写了|=“怪异”
,因为我知道>是有效的identifier@OscarFranco:no。
是一种模式:)。因此,您不能在guard中使用它。它需要类型为Bool
的表达式。事实上否则
只是True
的别名。