从用户输入中读取浮点数或字符串

tac*_*her 7 haskell

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

readN = readNumbers []    

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

这在不导入库的情况下可行吗?

Wil*_*sem 6

您不应该读取该值,或者至少不要立即读取。您可以先检查该行是否为"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) -> …
Run Code Online (Sandbox Code Playgroud)

是,应该处理的情况下,如果你没有通过有效的浮点数的一部分。

因此,我们可以处理一个列表:

Prelude Text.Read> readNumbers 
1
4
end
[1.0,4.0]
Run Code Online (Sandbox Code Playgroud)

(这里的粗体部分是用户输入)。