[英]Haskell if then else with “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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.