Подтвердить что ты не робот

Вычисление чистых функций

Как я могу "убить" чистый расчет, который занимает слишком много времени? Я попробовал

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 на "реальную" функцию ввода-вывода, например getLine, и это работает как ожидалось.

4b9b3361

Ответ 1

Дело в том, что

return (fact 999999999)

немедленно возвращает и не запускает таймаут. Он возвращает бит, который будет оцениваться позже.

Если вы принудительно оцениваете возвращаемое значение,

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

он должен вызывать таймаут (если вы предоставляете стек достаточно большим, чтобы таймаут происходил до).