You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell反转IO代码不符预期求助:输出异常与逻辑偏差

问题分析与解决方案

你的问题出在两个关键地方:

  • 没有按单行读取处理输入,而是等待整个输入流结束才执行操作
  • 错误地反转了整个字符串的字符顺序,而非单词的排列顺序

常见错误代码示例(你可能写了类似这样的代码)

main = getContents >>= putStr . reverse

这段代码的问题:

  1. getContents会懒加载所有输入,直到你按下Ctrl+D触发EOF才会处理
  2. reverse直接反转整个字符串的字符,所以"hello world"会变成"dlrow olleh"

正确实现代码

main = do
  line <- getLine
  putStrLn $ unwords $ reverse $ words line

代码逐段解释

  • getLine:读取单行输入,按下回车就立即返回结果,不需要等待EOF
  • words 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:15:35