1

我正在尝试从输入中读取 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";
}

问题是当字符串打印在主目录时,我仍然得到“ * Exception: Prelude.read: no parse”。是懒惰评估的问题吗?我该如何解决?

4

1 回答 1

6

是的,这是由惰性评估引起的。该代码return (Just (read numstring))不会导致读取发生,只会在main评估putStr强制)字符串时发生。

不要为此使用异常,而是使用更合适的函数,例如readMaybefrom Text.Read,或者包中Safe模块中的函数之一。safe

于 2013-08-20T20:44:55.433 回答