我正在尝试编写一个获取多个字符串输入并以空行('\ n')结尾的函数

getLines :: IO [String]
getLines = do x <- getLine
           if x == ""
           return ()
           else do xs <- getLines
                return (x:xs)

它无法编译说if语句有问题

理想情况下,我想像这样工作

getLines

苹果





(按下输入)

输出:
[“苹果”,“鸟”,“猫”]

最佳答案

您需要在then之后加上if,并且()(空元组)应该是[](空列表)。在if中,如果thenelse位于单独的行中,则也需要缩进,因为if then else是运算符,并且编译器需要知道表达式会继续。您需要调整缩进量,以使所有缩进量都超过领先的do:

getLines :: IO [String]
getLines = do x <- getLine
              if x == ""
                then return []
                else do xs <- getLines
                        return (x:xs)

否则,所有内容的缩进量都要超过包含开头do的行:
getLines :: IO [String]
getLines = do
  x <- getLine
  if x == ""
    then return []
    else do
      xs <- getLines
      return (x:xs)

作为样式问题,您也可以使用null x代替x == ""

08-04 00:11