哈斯克尔,如果还有"two statements"



我该怎么做:

if n > 0
then putStrLn "Hello"
     putStrLn "Anything"

我想在一个条件下有"两个语句",但我不断收到编译错误

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

then只能取一个值。 但你很幸运,因为do将多个IO()值粉碎为一个......

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

请记住,在 Haskell 中,您还需要一个else(并且return ()创建了什么都不做的琐碎IO())。

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

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

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")

最新更新