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

そのために例外を使用しないでください。むしろ from のようなより適切な関数readMaybeText.ReadまたはパッケージSafe内のモジュールの関数の 1 つを使用してください。safe

于 2013-08-20T20:44:55.433 に答える