Come posso "uccidere" un calcolo puro che richiede troppo tempo? Ho provatoTiming out pure functions
import System.Timeout
fact 0 = 1
fact n = n * (fact $ n - 1)
main = do maybeNum <- timeout (10^7) $ (return . fact) 99999999
print maybeNum
Tuttavia, questo non funziona. Sostituire (return . fact) 99999999
con una funzione IO "reale" come getLine
e funziona come previsto.
Interessante che se 'fact' diventa" reale "azione IO (' fact 0 = return 1; fact n = (n *) \ 'fmap \' (fact $ n - 1) ') quindi' timeout' funziona come previsto anche. –
@MatveyAksenov: Penso che non sia tanto perché la funzione è una vera e propria azione IO, ma perché la sua ricorsione è, per mezzo di 'fmap', spostata nella monade' IO'. – leftaroundabout
Se è necessario eseguire il timeout del codice arbitrario e potenzialmente dannoso, accertarsi di testare i loop non allocati molto semplici, ad es. 'Sia x = x in x' e' let x() = x() in x() '. –