我正在尝试编写一个获取多个字符串输入并在空行终止的函数('\ n')我有以下内容
getLines :: IO [String]
getLines = do x <- getLine
if x == ""
return ()
else do xs <- getLines
return (x:xs)
无法编译说if语句
有问题理想情况下,我想像这样工作
getLines
苹果
鸟
猫
(按下输入)
输出: [ “苹果”, “鸟”, “猫”]
答案 0 :(得分: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)
或者所有内容都比包含前导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
。我认为应该就这样做。