Wir alle wissen (oder sollten wissen), dass Haskell standardmäßig faul ist. Nichts wird ausgewertet, bis es ausgewertet werden muss. Wann muss also etwas bewertet werden? Es gibt Punkte, an denen Haskell streng sein muss. Ich nenne diese "Strenge Punkte", obwohl dieser spezielle Begriff nicht so weit verbreitet ist, wie ich gedacht hatte. Nach mir:
Eine Reduktion (oder Bewertung) in Haskell erfolgt nur an Strengepunkten.
Die Frage ist also: Was genau sind Haskells Strengepunkte? Meine Intuition sagt , dass main
, seq
/ Knall - Muster, Pattern - Matching, und jede IO
Aktion durchgeführt über main
die primären Strikt Punkte, aber ich weiß wirklich nicht , warum ich das wissen.
(Wenn sie nicht als "Strenge Punkte" bezeichnet werden, wie heißen sie dann?)
Ich kann mir vorstellen, dass eine gute Antwort eine Diskussion über WHNF und so weiter beinhalten wird. Ich stelle mir auch vor, dass es den Lambda-Kalkül berühren könnte.
Bearbeiten: zusätzliche Gedanken zu dieser Frage.
Da ich über diese Frage nachgedacht habe, denke ich, dass es klarer wäre, der Definition eines Strengepunkts etwas hinzuzufügen. Strenge Punkte können unterschiedliche Kontexte und unterschiedliche Tiefen (oder Strenge) haben. Zurück zu meiner Definition, dass "Reduktion in Haskell nur an Strengepunkten auftritt", fügen wir dieser Definition diese Klausel hinzu: "Ein Strengepunkt wird nur ausgelöst, wenn sein umgebender Kontext bewertet oder reduziert wird."
Lassen Sie mich versuchen, Ihnen die Art von Antwort zu geben, die ich möchte. main
ist ein strenger Punkt. Es wird speziell als primärer Strengepunkt seines Kontextes bezeichnet: das Programm. Wenn das Programm ( main
der Kontext) ausgewertet wird, wird der Strengepunkt von main aktiviert. Die Tiefe des Mains ist maximal: Es muss vollständig ausgewertet werden. Main besteht normalerweise aus E / A-Aktionen, die auch Strengepunkte sind und deren Kontext ist main
.
Jetzt versuchen Sie: Diskutieren seq
und Mustervergleich in diesen Begriffen. Erklären Sie die Nuancen der Funktionsanwendung: Wie streng ist sie? Wie ist es nicht Was ist mit deepseq
? let
und case
Aussagen? unsafePerformIO
? Debug.Trace
? Top-Level-Definitionen? Strenge Datentypen? Knallmuster? Wie viele dieser Elemente können nur in Form von Seq oder Pattern Matching beschrieben werden?
+
bei den eingebauten numerischen Typen, erzwingen ebenfalls Strenge, und ich gehe davon aus, dass dies auch für reine FFI-Aufrufe gilt.
seq
und Mustervergleich ausreichend sind, wobei der Rest in Bezug auf diese definiert wird. Ich denke, Pattern Matching gewährleistetIO
zum Beispiel die Strenge der Handlungen.