我想使用Haskell将类似12 34 56
的输入读入三个整数。
对于单个整数,可以使用myInteger <- readLn
。但是对于这种情况,我没有找到任何解决方案,除了首先读取一行,然后用,
替换所有空格,(使用类似的东西:
spaceToCommas str =
let repl ' ' = ','
repl c = c
in map repl str
)然后调用感觉非常hackish的read '[' ++ str ++ ']'
。此外,它不允许我声明我想要读取三个整数,它将尝试从stdin读取任何的整数量。
必须有更好的方法。
请注意,我想要一个不依赖外部包的解决方案。使用例如Parsec当然很棒,但是这个简单的例子不应该要求使用成熟的Parser Combinator框架,对吗?
答案 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))
我在这里返回了一个元组,它向右旋转一个位置以显示解析完成。