Haskell如何复用函数实现循环:数字判断交互逻辑问题求解
问题原因
你的代码存在两个核心错误:
if的then分支缺少do关键字包裹多步操作。在Haskell的do代码块中,if的单个分支如果要执行多条IO操作,必须显式用do把这些操作包装为一个整体,否则只有紧跟在then后面的第一条语句属于then分支,后续语句会被视为外层do块的内容,不管条件是否成立都会执行。- 错误调用了
myread而非递归调用isItLarge。你需要回到「输入→判断」的完整流程才能实现循环重试,myread仅负责读取输入,没有后续的判断逻辑,调用它只会读取一次数字就丢弃结果,不会继续校验数值大小。
你后续修改的代码是完全正确的,修改后then分支用do包裹了提示和递归调用两个操作,递归调用isItLarge会重新触发完整的输入判断流程,直到输入数值≥77时输出对应提示结束程序。
修正后的完整可运行代码如下:
import Text.Read myread :: IO Int myread = do putStr "Please enter a number: " x <- readLn return x isItLarge :: IO() isItLarge = do result <- myread if result < 77 then do putStrLn "Tiny, try again!" isItLarge else putStrLn "Massive!"
内容的提问来源于stack exchange,提问作者user17350600
相关产品推荐
相关产品推荐

