我想读取像 12 34 56
这样的输入使用 Haskell 将其分解为三个整数。
对于单个整数,可以使用 myInteger <- readLn
。但对于这种情况,我没有找到任何解决方案,除了首先读取一行,然后用 ,
替换所有空格。 ,(使用类似:
spaceToCommas str =
let repl ' ' = ','
repl c = c
in map repl str
),然后调用read '[' ++ str ++ ']'
这感觉很hackish。另外,它不允许我声明我想要读取三个 个整数,它将尝试从标准输入读取任意 数量的整数。
必须有更好的方法。
请注意,我想要一个不依赖外部包的解决方案。使用例如Parsec 当然很棒,但是这个简单的示例不需要使用成熟的解析器组合器框架,对吗?
最佳答案
如何将字符串转换为:
convert :: Read a => String -> [a]
convert = map read . words
words
将给定的字符串拆分为字符串列表(“单词”),然后我们使用 map
对每个元素执行 read
>.
例如使用它:
main = do
line <- getLine
let [a,b,c] = convert line :: [Int] in putStrLn (show (c,a,b))
或者,例如,如果您想阅读前三个元素而不关心其余部分(是的,这显然需要 super 创造力技能):
main = do
line <- getLine
let (a:b:c:_) = convert line :: [Int] in putStrLn (show (c,a,b))
我在这里返回了一个元组,该元组向右旋转一个位置以显示解析已完成。
关于haskell - 如何在 Haskell 中从 stdin 读取三个连续整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42253027/