Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell,如何用语句的大小写替换嵌套if?_Haskell - Fatal编程技术网

Haskell,如何用语句的大小写替换嵌套if?

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如果有布尔表达式(条件),则需要使用保护,

我开始学习haskell,我正在解决一些简单的编程挑战。所以我现在的问题是根据传递的值打印一些文本:

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
的别名。