我需要输入一个输入,直到输入空行,当输入空行时,我需要打印每行的所有第一个字符(作为一个单词)。有人可以解释我应该在最后一行写什么吗?
inp :: IO String
inp
= do
line <- getLine
if null line
then return ""
else do
lines <- inp
return lines????
我不想破坏一切,但这里有一些提示:
String
实际上只是[Char]
.(:) :: a -> [a] -> [a]
函数(尤其是(:) :: Char -> String -> String
)将新元素附加到前面。您可以将此功能大声朗读为“缺点”。例如,1:[2,3,4]
与 相同[1,2,3,4]
,与'a':"bcd"
相同"abcd"
。head :: [a] -> a
函数(尤其是head :: String -> Char
)请求其第一个元素。null
and if
// then
; else
这也消除了对 的需要head
,这通常是代码异味。从评论中,您还尝试过这样的最后一行:
return head(lines) : []
这里的主要问题是这return
不是 Haskell 中的关键字,它只是一个普通的旧函数。所以如果你的论点是一个表达式,你需要给它加上括号(或者使用各种技巧来避免括号):
return (head(lines) : [])
return (head lines : [])
return $ head lines : []
return [head lines]
let answer = head lines : [] in return answer
等等。这应该可以让您进行类型检查和运行;然后您可以开始纠正代码行为中的错误。=)