为什么捕获不起作用?

时间:2013-08-20 20:37:47

标签: haskell input

我正在尝试从输入中读取一个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”。 这是懒惰评估的问题吗?我该如何解决?

1 个答案:

答案 0 :(得分:6)

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

不要使用异常,而是更合适的功能,例如来自Text.Read的{​​{3}},或来自safe包中readMaybe模块的其中一个功能