0

我需要输入一个输入,直到输入空行,当输入空行时,我需要打印每行的所有第一个字符(作为一个单词)。有人可以解释我应该在最后一行写什么吗?

inp :: IO String
inp
   = do
      line <- getLine
      if null line
         then return ""
         else do
            lines <- inp
            return lines????
4

1 回答 1

3

我不想破坏一切,但这里有一些提示:

  1. String实际上只是[Char].
  2. 您可以构造一个与旧列表一样的新列表,但使用(:) :: a -> [a] -> [a]函数(尤其是(:) :: Char -> String -> String)将新元素附加到前面。您可以将此功能大声朗读为“缺点”。例如,1:[2,3,4]与 相同[1,2,3,4],与'a':"bcd"相同"abcd"
  3. 当您确定列表不为空时,您可以使用head :: [a] -> a函数(尤其是head :: String -> Char)请求其第一个元素。
  4. 作为一种替代策略,您可能希望研究模式匹配而不是使用nulland 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

等等。这应该可以让您进行类型检查和运行;然后您可以开始纠正代码行为中的错误。=)

于 2012-05-21T18:40:59.597 回答