在尝试使用do块内的条件时,在输入'if'上解析错误

时间:2014-05-05 00:19:52

标签: haskell

我有以下代码,我已经尝试了多种方法来编写它,但我无法使其工作。我需要的是在if块内使用do条件。

palin :: IO ()
palin 
  = do line <- getLine
       putStr line
       if True
         then putStr line

我将条件更改为true只是为了让它更容易。我尝试添加else句子,但我也一样。

3 个答案:

答案 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"