如何从Haskell中的stdin中读取三个连续的整数?

时间:2017-02-15 15:06:13

标签: haskell io-monad

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

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

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

)然后调用感觉非常hackish的read '[' ++ str ++ ']'。此外,它不允许我声明我想要读取三个整数,它将尝试从stdin读取任何的整数量。

必须有更好的方法。

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

1 个答案:

答案 0 :(得分:4)

如何转换字符串如下:

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

words将给定字符串拆分为字符串列表(&#34;字词&#34;)然后我们使用read对每个元素执行map

,例如使用它:

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))

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