Haskell反转IO代码不符预期求助:输出异常与逻辑偏差
问题分析与解决方案
你的问题出在两个关键地方:
- 没有按单行读取处理输入,而是等待整个输入流结束才执行操作
- 错误地反转了整个字符串的字符顺序,而非单词的排列顺序
常见错误代码示例(你可能写了类似这样的代码)
main = getContents >>= putStr . reverse
这段代码的问题:
getContents会懒加载所有输入,直到你按下Ctrl+D触发EOF才会处理reverse直接反转整个字符串的字符,所以"hello world"会变成"dlrow olleh"
正确实现代码
main = do line <- getLine putStrLn $ unwords $ reverse $ words line
代码逐段解释
getLine:读取单行输入,按下回车就立即返回结果,不需要等待EOFwords line:将输入行按空格分割成单词列表,示例输入会变成["hello", "world"]reverse:反转单词列表的顺序,得到["world", "hello"]unwords:将反转后的单词列表重新拼接成带空格的字符串putStrLn:输出结果并自动换行,实现即时反馈
扩展:处理多行输入(如果需要)
如果要支持输入多行、每行即时反转单词顺序,可以用forever循环:
import Control.Monad (forever) main = forever $ do line <- getLine putStrLn $ unwords $ reverse $ words line
按下Ctrl+C可以终止程序。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

