Haskell if then else 带有”两个语句”

Haskell if then else with "two statements"

我该怎么做:

1
2
3
if n > 0
then putStrLn"Hello"
     putStrLn"Anything"

我想在一种情况下使用"两条语句",但我不断收到编译错误

我尝试使用分号但没有成功


then 只能取一个值....但是你很幸运,因为 do 将多个 IO() 值合并为一个....

1
2
3
4
5
if n > 0
  then do
    putStrLn"Hello"
    putStrLn"Anything"
  else return ()

请记住,在 Haskell 中,您还需要一个 else(并且 return () 创建了一个不做任何事情的普通 IO())。


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

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

1
2
putStrLn"Hello"
putStrLn"Anything"

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

来完成

1
putStrLn"Hello">> putStrLn"Anything"

还有一种使用 do 块的替代语法。

1
2
3
do
  putStrLn"Hello"
  putStrLn"Anything"

这里要注意的重要一点是,这将编译为与上面示例相同的 >> 代码。 do 块可以被认为是语法糖(还有更多内容,但为简单起见,您可以这样想。)

把这一切放在一起就剩下了

1
2
3
if n > 0
then putStrLn"Hello">> putStrLn"Anything"
else return ()

或使用 do 块

1
2
3
4
5
if n > 0
then do
  putStrLn"Hello"
  putStrLn"Anything"
else return ()

因为这种模式很常见,所以有一个 when 组合子(在 Control.Monad 中),它正是这样做的

1
2
3
4
when (n > 0)
  do
    putStrLn"Hello"
    putStrLn"Anything"

或者只是

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