As shown in this answer, seq
combinato con undefined
fa cose molto strane quando si tratta di ragionamento equo, ad esempio può far fallire qualsiasi monade. Un altro esempio è in this question.È `evaluate` safe rispetto a` seq`?
Recentemente mi sono imbattuto in evaluate :: a -> IO a
che fa una cosa simile: valuta il suo argomento su WHNF ma solo quando viene valutata l'azione IO
. Questo sembra essere molto più sicuro, poiché ci si aspetta che "in IO
possiamo fare tutto". Ovviamente non può essere usato ovunque, ma spesso la necessità di valutare un'espressione è in qualche modo connessa con un'operazione IO
(come forzare un thread di produzione per valutare un calcolo invece di un thread di consumo quando si lavora con MVar
s).
Quindi mi piacerebbe chiedere, quanto è sicuro evaluate
? È possibile creare degli esempi (coinvolgere lo IO
ovviamente) dove si interrompe il ragionamento sul codice come seq
? O posso considerarlo come una sostituzione sicura di seq
(se è possibile per un particolare programma)?