21

時間がかかりすぎる純粋な計算を「強制終了」するにはどうすればよいですか? 私は試した

import System.Timeout

fact 0 = 1
fact n = n * (fact $ n - 1)

main = do maybeNum <- timeout (10 ^ 7) $ (return . fact) 99999999
          print maybeNum

ただし、これは機能しません。(return . fact) 99999999を「実際の」IO関数に置き換えるgetLineと、これは期待どおりに機能します。

4

1 に答える 1

23

ポイントは、

return (fact 999999999)

すぐに戻り、タイムアウトをトリガーしません。後で評価されるサンクを返します。

戻り値の評価を強制すると、

main = do maybeNum <- timeout (10 ^ 7) $ return $! fact 99999999
          print maybeNum

タイムアウトをトリガーする必要があります(スタックオーバーフローの前にタイムアウトが発生するように十分な大きさのスタックを提供する場合)。

于 2012-04-09T10:08:13.460 に答える