Ich habe wirklich große Probleme damit, callCC zu verstehen. Ich bekomme die Kraft von Fortsetzungen und habe das Konzept in einigen meiner Projekte verwendet, um coole Konzepte zu erstellen. Aber ich musste nie etwas mit größeren Fähigkeiten als verwenden cont :: ((a->r)->r)-> Cont r a
.
Nachdem ich es benutzt habe, ist es sehr sinnvoll, warum sie die Cont-Monade die Mutter aller Monaden nennen. NOCH, ich verstehe nicht, wann ich sie brauchen würde callCC
, und genau das ist meine Frage.
haskell
functional-programming
monads
Alejandro Navas
quelle
quelle
Cont
? Wenn Sie sagen, dass Sie nichts Stärkeres als benötigencont
, bedeutet das, dass Sie es nicht verwendet habenreset
oder auchshift
nicht?reset
odershift
. Ich habe es verwendet, um eine eingebettete Sprache zu definieren, die angehalten werden kann, bis eine bestimmte Aktion durch einen anderen Prozess aufgelöst wird, und dann mit der angegebenen "Fortsetzung" fortgesetzt wird. Vielleicht habe ich den Eindruck, viel Erfahrung mit Cont Monad zu haben, aber nicht so viel, ich möchte callCCAntworten:
callCC
gibt Ihnen "Early Return" -Semantik, aber in einem monadischen Kontext.Angenommen , Sie wollten
doOne
, und wenn das zurückkehrtTrue
, erhalten Sie sofort stoppen, sonst Sie gehen aufdoTwo
unddoThree
:Sehen Sie diese
if
Verzweigung dort? Ein Zweig ist nicht so schlecht, könnte behandelt werden, aber stellen Sie sich vor, es gibt mehrere solcher Punkte, an denen Sie nur auf Kaution gehen möchten? Das wird sehr schnell sehr hässlich.Mit können
callCC
Sie "vorzeitige Rückkehr" haben: Sie kassieren am Verzweigungspunkt und müssen den Rest der Berechnung nicht verschachteln:Viel angenehmer zu lesen!
Noch wichtiger ist, da es sich
ret
hier nicht um eine spezielle Syntax (wiereturn
in C-ähnlichen Sprachen) handelt, sondern nur um einen Wert wie jeden anderen, können Sie ihn auch an andere Funktionen übergeben! Und diese Funktionen können dann eine sogenannte "nicht-lokale Rückgabe" ausführen - dh sie können diedoThings
Berechnung "stoppen" , selbst wenn mehrere verschachtelte Aufrufe tief sind. Zum Beispiel könnte ich die Überprüfung desdoOne
Ergebnisses in eine separate FunktioncheckOne
wie diese zerlegen:quelle
b
ist im Grunde nur ein Platzhalter, damit Sie mehr Fortsetzungen innerhalb von callCC verketten können. Sobaldret
es angewendet wird, wird die von call cc erzeugte Fortsetzung jedenfalls "zurückgeben", was auch immer eingegeben wurderet
. Das ist ziemlich verworren, aber ziemlich klug und doch extrem mächtig. Ich sehe nicht viele Orte, an denen es nicht so ist, eine Fliege mit einer Nuklearwaffe zu töten