Haskell,如果那么其他的"两个陈述"

时间:2014-11-21 04:46:24

标签: haskell

我该怎么做:

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

我想要"两个陈述"在一个条件但我不断收到编译错误

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

2 个答案:

答案 0 :(得分:17)

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

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

请记住,在Haskell中,您还需要else(而return ()会创建无效的IO()

答案 1 :(得分:4)

你的例子在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 block

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