我希望能够从控制台输入中读取数字,并将其存储到列表中,直到用户键入结束为止,如下所示:

readN = readNumbers []

readNumbers nums = do
      n <- readFloatOrString
      case n of
        <<number>> -> return readNumbers (nums ++ [n])
        "end" -> return nums

这可以在不导入库的情况下实现吗?

最佳答案

您不应该读取该值,或者至少不立即读取该值。您可以先检查行是否为"end",如果是,则返回数字,否则继续阅读:

import Text.Read(readMaybe)

readNumbers :: IO [Float]
readNumbers = do
      n <- getLine
      case (n, readMaybe n :: Maybe Float) of
        ("end", _) -> pure []
        (_, Just n) -> (n:) <$> readNumbers
        (_, Nothing) -> …

如果未传递有效的浮点数,则是应该处理此情况的部分。

因此,我们可以使用以下方式处理列表:
Prelude Text.Read> readNumbers
1
4
end
[1.0,4.0]

(此处的黑体字是用户输入的内容)。

关于haskell - 从用户输入读取浮点数或字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62235331/

10-13 05:15