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

Dem*_*dus 6 haskell

我有以下代码,我已经尝试了多种方法来编写它,但我不能使它工作.我需要的是ifdo块内使用条件.

palin :: IO ()
palin 
  = do line <- getLine
       putStr line
       if True
         then putStr line
Run Code Online (Sandbox Code Playgroud)

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

dup*_*ode 11

在Haskell中,if-else表达式并不意味着"如果为true,则执行foo;否则,执行bar",但"如果为true,则值为foo;否则,值为bar".出于这个原因,你不能省略else,就像conditon ? foo : bar在其他语言中使用三元if运算符()时一样.在您的情况下,then部件是类型的值IO (),因此您需要else具有相同类型的值.如果条件为false,您不希望实际发生antyhing,最直接的解决方案是使用虚拟IO ()值,return ():

palin :: IO ()
palin 
  = do line <- getLine
       putStr line
       if True
         then putStr line
         else return ()
Run Code Online (Sandbox Code Playgroud)

你也可以使用when函数from Control.Monad,它具有相同的效果:

import Control.Monad

palin :: IO ()
palin 
  = do line <- getLine
       putStr line
       when True (putStr line)
Run Code Online (Sandbox Code Playgroud)