我该怎么做:
if n > 0
then putStrLn "Hello"
putStrLn "Anything"
我想要"两个陈述"在一个条件但我不断收到编译错误
我尝试使用分号而没有运气
答案 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")