Haskell if then else随以“;“两种说法”;

Haskell if then else随以“;“两种说法”;,haskell,Haskell,我如何做到这一点: if n > 0 then putStrLn "Hello" putStrLn "Anything" 我希望在一个条件下有“两个语句”,但我不断得到编译错误 我尝试使用分号,但没有运气那么只能取一个值。。。。但是您很幸运,因为do将多个IO()值粉碎为一个 if n > 0 then do putStrLn "Hello" putStrLn "Anything" else return () 请记住,在Haskell中,您还需

我如何做到这一点:

if n > 0
then putStrLn "Hello"
     putStrLn "Anything"
我希望在一个条件下有“两个语句”,但我不断得到编译错误


我尝试使用分号,但没有运气

那么
只能取一个值。。。。但是您很幸运,因为
do
将多个
IO()
值粉碎为一个

if n > 0
  then do
    putStrLn "Hello"
    putStrLn "Anything"
  else return ()

请记住,在Haskell中,您还需要一个
else
(并且
return()
创建了一个无关紧要的
IO()

您的示例在Haskell中没有意义。每个表达式都需要有一个值,这就是为什么总是需要一个
else
,即使它只是
返回()

因为它需要一个单一的表达式,你不能只是这样做

putStrLn "Hello"
putStrLn "Anything"
因为这是两个类型为
IO()
的表达式,这意味着它是一个具有一些外部效应的计算,并且没有结果。您有两个需要按顺序运行的计算,可以使用
>
组合器来完成

putStrLn "Hello" >> putStrLn "Anything"
还有一种使用
do
块的替代语法

do
  putStrLn "Hello"
  putStrLn "Anything"
这里需要注意的重要一点是,这将编译成与上述示例相同的
>
代码。
可以将
do
块视为语法糖(还有更多的功能,但为了简单起见,您可以这样想。)

把这些放在一起,我们就有了

if n > 0
then putStrLn "Hello" >> putStrLn "Anything"
else return ()
或者使用do块

if n > 0
then do
  putStrLn "Hello"
  putStrLn "Anything"
else return ()
因为这种模式非常常见,所以有一个
when
组合器(在
Control.Monad
中),它正好做到这一点

when (n > 0)
  do
    putStrLn "Hello"
    putStrLn "Anything"
或者干脆

when (n > 0) (putStrLn "Hello" >> putStrLn "Anything")

如果您不喜欢
else返回()
可以使用
when
来自
Control.Monad
而不是
If。。然后。。。否则…