Вот выдержка из документации evaluate
:
Control.Exception.Base.evaluate :: a -> IO a
evaluate x
не совпадает с
return $! x
Правильное определение
evaluate x = (return $! x) >>= return
(источник)
Кажется, они имеют одинаковое значение. В чем разница между этими двумя определениями?