我该怎么做:
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")