我正在尝试从输入中读取一个Int并管理来自用户的错误输入。
这段代码完成了这项工作,但似乎无法正常工作......
asknumplayers = do {
putStr "Please the number of other players:\n";
numstr <- getLine;
maybenum <- catch (return (Just (read numstr::Int))) (\(e::SomeException) -> return Nothing);
case maybenum of
Nothing -> asknumplayers;
Just num -> return num;
}
这是主要的:
main = do {
num <- asknumplayers;
putStr $ "Thank you, ready to play against "++ (show num) ++" players?!\n";
}
问题是,当在主要字符串中打印字符串时,我仍然会收到“ * 例外:Prelude.read:no parse”。 这是懒惰评估的问题吗?我该如何解决?
答案 0 :(得分:6)
是的,这是由懒惰评估引起的。代码return (Just (read numstring))
不会导致读取发生,只有当main
评估(强制)字符串时才会发生putStr
。
不要使用异常,而是更合适的功能,例如来自Text.Read
的{{3}},或来自safe
包中readMaybe
模块的其中一个功能