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