Als shown in this answer, seq
kombiniert mit undefined
macht sehr seltsame Dinge, wenn es um Gleichsetzung geht, zum Beispiel kann es jede Monade zum Scheitern bringen. Ein anderes Beispiel ist in this question.Ist `evaluate` sicher im Vergleich zu` seq`?
Kürzlich stolperte ich über evaluate :: a -> IO a
, die eine ähnliche Sache tut - es wertet sein Argument zu WHNF aber nur aus, wenn die IO
Aktion ausgewertet wird. Dies scheint viel sicherer zu sein, da man erwartet, dass wir "in IO
alles machen können". Natürlich kann es nicht überall verwendet werden, aber oft ist die Notwendigkeit, einen Ausdruck auszuwerten, irgendwie mit einer IO
Operation verbunden (wie man einen produzierenden Thread zwingt, eine Berechnung anstelle eines konsumierenden Threads zu bewerten, wenn man mit MVar
arbeitet).
Also ich möchte fragen, wie sicher ist evaluate
? Ist es möglich, Beispiele zu erstellen (beinhalten IO
natürlich), wo es die Argumentation über Code wie seq
bricht? Oder kann ich es als einen sicheren Ersatz für seq
betrachten (wenn es für ein bestimmtes Programm möglich ist)?