2013-08-20 61 views
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"; 
} 

的問題是,我仍然當字符串打印在主文件中時,得到「*異常:Prelude.read:no parse」。 這是一個懶惰評估問題嗎?我應該如何解決它?

+0

可能的重複:[如何在Haskell中正確使用Control.Exception.catch?](http://stackoverflow.com/q/18052619/1333025)。 –

回答

6

是的,這是由懶惰的評價。代碼return (Just (read numstring))不會導致讀取發生,這隻會發生在mainputStr評估()字符串。

不要使用異常爲,而是更合適的函數等readMaybeText.Read,或從在safeSafe模塊的功能之一。