2

我正在尝试编写一个获取多个字符串输入并在空行('\n')上终止的函数,我有以下内容

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

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

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

获取线

苹果

(输入被按下)

输出:["Apple","Bird","Cat"]

4

2 回答 2

7

您需要thenafter if,并且()(empty tuple) 应该是[](empty list)。在if中,如果thenandelse位于不同的行上,它们也需要缩进,因为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 == "".

于 2013-04-03T21:18:48.317 回答
1

这几乎是对的。

你需要一个then在你的if. 您可能还需要稍微更改缩进,以便所有内容都缩进到x而不是do. 我认为应该这样做。

于 2013-04-03T21:05:53.537 回答