在Haskell中打印整数列表时为何出现‘Prelude.read: no parse’错误?
问题原因
Haskell的read函数对输入格式有严格要求,解析[Int]类型时,必须符合Haskell列表的语法规范——带方括号包裹,元素用逗号分隔(比如[2,4,6,8])。你输入的2 4 6 8是空格分隔的数字串,不符合read的解析规则,因此触发Prelude.read: no parse错误。
解决方法
方法1:修改输入格式
直接按Haskell列表语法输入,比如输入:
[2,4,6,8]
原代码即可正常运行,输出为:
The entered list is: [2,4,6,8]
方法2:修改代码适配空格分隔输入
如果希望支持空格分隔的输入格式,可将输入字符串拆分后逐个转换为整数,代码如下:
main = do putStrLn "Enter a list of integers:" input <- getLine let xs = map read (words input) :: [Int] putStr "The entered list is: " print xs
words input将输入字符串按空格拆分为单个数字的字符串列表(如"2 4 6 8"转为["2","4","6","8"])map read把每个字符串转换为Int类型,最终得到[Int]列表
方法3:适配预期输出格式
如果想要输出是空格分隔的形式(而非Haskell默认的带方括号格式),可调整输出逻辑:
main = do putStrLn "Enter a list of integers:" input <- getLine let xs = map read (words input) :: [Int] putStr "The entered list is: " putStrLn $ unwords (map show xs)
此时输入2 4 6 8,输出将完全符合你的预期:
The entered list is: 2 4 6 8
内容的提问来源于stack exchange,提问作者SpicySugar
相关产品推荐
相关产品推荐

