如何从 Haskell 中的标准输入读取三个连续的整数?

How to read three consecutive integers from stdin in Haskell?

我想使用 Haskell 将 12 34 56 这样的输入读入三个整数。

对于单个整数,可以使用 myInteger <- readLn。但是对于这种情况,我还没有找到任何解决方案,除了首先读取一行,然后用 , 替换所有空格(使用类似:

spaceToCommas str =
  let repl ' ' = ','
      repl  c =   c
  in map repl str

),然后调用 read '[' ++ str ++ ']',这让人感觉很老套。此外,它不允许我声明我想读取 three 个整数,它将尝试从标准输入读取 any 个整数。

必须有更好的方法。

请注意,我想要一个 依赖外部包的解决方案。使用例如Parsec 当然很棒,但是这个简单的例子应该不需要使用成熟的 Parser Combinator 框架,对吧?

如何转换字符串:

convert :: Read a => String -> [a]
convert = map read . words

words 将给定的字符串拆分为字符串列表("words"),然后我们使用 map.[=16 对每个元素执行 read =]

例如像这样使用它:

main = do
    line <- getLine
    let [a,b,c] = convert line :: [Int] in putStrLn (show (c,a,b))

或者如果你想阅读前三个元素而不关心其余部分(是的,这显然需要 超级-创造力):

main = do
    line <- getLine
    let (a:b:c:_) = convert line :: [Int] in putStrLn (show (c,a,b))

我在这里返回了一个元组,它向右旋转了一个位置以显示解析已完成。