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.