【问题标题】:Why catch is not working?为什么捕捉不起作用?
【发布时间】:2013-10-30 10:31:17
【问题描述】:

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

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

【问题讨论】:

标签: haskell input


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多