Haskell- IO String获得多行

lop*_*304 2 string io haskell list

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

getLines :: IO [String]
getLines = do x <- getLine
           if x == ""
           return ()
           else do xs <- getLines
                return (x:xs)
Run Code Online (Sandbox Code Playgroud)

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

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

getLines

苹果

(输入按下)

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

Jon*_*rdy 7

你需要then之后if,()(空元组)应该是[](空列表).在if,then并且else需要缩进,如果它们在单独的行上,因为if then else是一个运算符,并且编译器需要知道表达式继续.你的缩进需要调整,以便所有内容都比领先缩进更多do:

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

或者所有内容都比包含前导的缩进更多do:

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

作为一种风格,你也可以用null x而不是x == "".