我有以下代码,我已经尝试了多种方法来编写它,但我无法使其工作。我需要的是在if
块内使用do
条件。
palin :: IO ()
palin
= do line <- getLine
putStr line
if True
then putStr line
我将条件更改为true只是为了让它更容易。我尝试添加else
句子,但我也一样。
答案 0 :(得分:11)
在Haskell中,if-else表达式并不意味着&#34;如果为true,则执行foo;否则,执行bar&#34;,但是&#34;如果为true,则值为foo;否则,值为bar&#34;。出于这个原因,您不能省略else
,就像在其他语言中使用三元if运算符(conditon ? foo : bar
)时一样。在您的情况下,then
部分是IO ()
类型的值,因此您需要具有相同类型的else
。如果条件为假,您不希望实际发生antyhing,最直接的解决方案是使用虚拟IO ()
值return ()
:
palin :: IO ()
palin
= do line <- getLine
putStr line
if True
then putStr line
else return ()
您还可以使用when
中的Control.Monad
功能,效果相同:
import Control.Monad
palin :: IO ()
palin
= do line <- getLine
putStr line
when True (putStr line)
答案 1 :(得分:2)
你错过了其他人。
palin :: IO ()
palin = do
line <- getLine
putStr line --Probably better to use putStrLn?
if True then putStr line else putStr "hi" --Also consider putStrLn here?
如果你来自Python,你需要提供一个值,然后考虑像
这样的东西 a = "dogs" if 1 < 0 else "cats"
在这里,你需要提供其他没有它的变量赋值不会运行。
答案 2 :(得分:2)
在Haskell中,=
之后的所有内容都是表达式,而表达式通常都有值。甚至条件语句也是putStr "hi"
的表达式,并且它们具有(返回)值。如果if
返回值是相应分支的值(那么或者)。如果putStr "hi"
它涉及的更多,我不会在这里解释它(参见IO和monads)
所以编写代码的正确方法如下:
palin :: IO ()
palin = do line <- getLine
if True
then putStr line
else return ()
-- this return has nothing to do with return in python
-- basically it means "do nothing"