Haskell中如何在case语句分支中实现多行IO操作?
解决Haskell case分支中递归调用输入函数的问题
你的问题核心是在Left分支中需要连续执行两个IO操作:打印提示+递归调用points,只需要把这两个操作放在同一个do块里就行,Haskell允许在case分支中用do来组合多个IO动作。
修改后的代码如下:
import Control.Exception (try, SomeException) points = do pts <- try(readLn :: IO Int) :: IO (Either SomeException Int) case pts of Left ex -> do putStrLn "Please enter a number." points -- 递归调用自身,重新发起输入请求 Right val -> return val
关键说明:
Left分支改用do块包裹两个操作:先打印错误提示,再递归调用points函数,这样就能实现"输入错误→提示→重新输入"的循环逻辑。- 调整了
Right分支的返回值:直接返回合法的整数val,此时points的类型变为IO Int,比原代码返回IO (Either SomeException Int)更实用——因为递归逻辑会确保只有输入正确时才会返回,最终你拿到的肯定是合法整数。 - 别忘了导入
Control.Exception模块,否则try和SomeException会无法识别。
如果确实需要保持原函数返回IO (Either SomeException Int)的类型(虽然递归场景下这个类型意义不大,因为错误分支会一直递归直到成功),可以把Right分支改成return pts,Left分支的do块最后保留points即可,类型会自动匹配。
内容的提问来源于stack exchange,提问作者RadiantAine
相关产品推荐
相关产品推荐

