如何从 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))
我在这里返回了一个元组,它向右旋转了一个位置以显示解析已完成。
我想使用 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))
我在这里返回了一个元组,它向右旋转了一个位置以显示解析已完成。