haskell timeout purely-functional

haskell - Tiempo fuera de funciones puras



timeout purely-functional (1)

El caso es que

return (fact 999999999)

Inmediatamente regresa y no dispara el tiempo de espera. Devuelve un procesador que será evaluado más adelante.

Si fuerza la evaluación del valor de retorno,

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

debe activar el tiempo de espera (si proporciona una pila lo suficientemente grande para que el tiempo de espera se ejecute antes del desbordamiento de la pila).

¿Cómo puedo "matar" un cálculo puro que está tomando demasiado tiempo? Lo intenté

import System.Timeout fact 0 = 1 fact n = n * (fact $ n - 1) main = do maybeNum <- timeout (10 ^ 7) $ (return . fact) 99999999 print maybeNum

Sin embargo, esto no funciona. Reemplace (return . fact) 99999999 con una función de IO "real" como getLine y esto funciona como se esperaba.