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

如何在Haskell中从stdin读取三个连续整数?,haskell,io-monad,Haskell,Io Monad,我想用Haskell将一个输入,如123456读入三个整数 对于单个整数,可以使用myInteger将字符串转换为: convert :: Read a => String -> [a] convert = map read . words words将给定字符串拆分为字符串列表(“单词”),然后使用map对每个元素执行read 例如,像这样使用它: main = do line <- getLine let [a,b,c] = convert line ::

我想用Haskell将一个输入,如
123456
读入三个整数


对于单个整数,可以使用
myInteger将字符串转换为:

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))
main=do

行为什么不在do块中调用
readLn
3次?或者使用带有副作用的映射,映射长度为3的范围,并在函数内部调用
readLn
。这将返回一个包含3个整数的列表。是否要从一行中读取3个整数?输入通常是行缓冲的-如果单行上有4个整数怎么办?如果只有两行呢?哦,你想读一行吗?为什么不直接在中阅读,然后在空格上拆分?@Carcigenicate是的,从一行开始。如果它们在多行上,那么你的解决方案是简单而完美的;你总是读一个字符串。然后需要对该字符串进行解析,其范围可以是琐碎的(如果您只需要一个具有
Read
实例的类型的单个值),也可以是复杂的。这不会从stdin中读取3个整数,它只需抓取一行,尝试全部读取,如果没有正好三个,则会出现模式匹配错误。(“此外,它不允许我声明我要读取三个整数,它将尝试从stdin中读取任意数量的整数。”@user2407038:不,它本身并不尝试全部读取,因为
map
是惰性的(并且
map
元素上的
fx
也是惰性的),此外,只要有一点点的创造力,你当然可以用两个、四个或任意数量的整数来实现场景:)。如何在模式匹配中正确使用这一点?当尝试使用
case convert行时,我总是得到一个
***异常:用户错误(Prelude.readIO:no parse)
我遇到的问题与代码中的其他内容有关
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))