3

我想12 34 56使用 Haskell 将输入读取为三个整数。

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

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

) 然后打电话read '[' ++ str ++ ']'感觉很hackish。此外,它不允许我说我想读取三个整数,它会尝试从标准输入读取任意数量的整数。

一定有更好的方法。

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

4

1 回答 1

4

转换字符串怎么样:

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

words将给定的字符串拆分为字符串列表(“单词”),然后我们read使用 . 对每个元素执行 a 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))

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

于 2017-02-15T15:12:53.150 回答