Haskell- IO String获得多行

时间:2013-04-03 21:02:44

标签: string list haskell io

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

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

无法编译说if语句

有问题

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

getLines

苹果

(按下输入)

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

2 个答案:

答案 0 :(得分:7)

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 == ""

答案 1 :(得分:1)

这几乎是正确的。

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