Ich arbeite an Camlp4-Erweiterung für Haskell-Do-Notation in Ocaml, und versuchen herauszufinden, wie GHC rekursive Do-Bindungen (aktiviert mit -XDoRec) kompiliert.
Ich frage mich, ob es für monadischen Fixpoint-Kombinator möglich ist, in strenger Sprache zu existieren (wie Ocaml/F #/SML/...)?
Wenn ja, wie kann es aussehen? Wäre es sehr nützlich?MonadFix in strenger Sprache
Antwort
Die # Berechnung F Ausdruckssyntax (bezogen auf Haskell do
) unterstützt Rekursion:
let rec ones = seq {
yield 1
yield! ones }
Dies wird unterstützt, da die Berechnung Builder hat Delay
Betrieb zusätzlich zu anderen monadischen (oder MonadPlus) Operationen zu unterstützen.
let rec ones =
seq.Combine
(seq.Yield(1),
seq.Delay(fun() -> seq.YieldFrom(ones)))
Die Art der Delay
ist in der Regel (unit -> M<'T>) -> M<'T>
und der Trick ist, dass es eine Berechnung mit Effekten Wraps (oder unmittelbarem Rekursivbezug) in eine verzögerte Berechnung, die auf ausgewertet wird: Der Code wird wie etwas übersetzt Nachfrage.
Wenn Sie mehr darüber erfahren wollen, wie der Mechanismus funktioniert in F #, dann die beiden folgenden Papiere sind relevant:
- Syntax Matters: Writing abstract computations in F#
- Initializing Mutually Referential Abstract Objects: The Value Recursion Challenge
Die erste beschreibt, wie die F # Berechnungsausdrucksyntax wird entzuckt (und wie Delay
eingefügt wird - und allgemein, wie F # verzögerte und eifrige Berechnungen mit Effekten kombiniert) und der zweite beschreibt, wie F #behandeltDeklarationen mit Werten - wie der Wert ones
oben.
- 1. MonadFix Beispiel für []
- 2. Strenger Modus in PHP?
- 3. MonadFix Instanz für Put
- 4. Strenger ISO-C-Konformitätstest
- 5. Teil Anwendung strenger Konstrukteuren
- 6. Hint Iterator strenger Typ Entitäten in PHPDoc
- 7. Warum ist die Typprüfung in Templates strenger?
- 8. Deaktivieren strenger Standards in PHP 5.4
- 9. Force mongodb zur Ausgabe strenger JSON
- 10. ist Swift strenger Klasse in Protokoll Vars durchsetzen?
- 11. Stellen strenger Wert für ein Feld in Mungo
- 12. Gibt es eine Instanz von Monad, aber nicht von MonadFix?
- 13. Sprache in einer Sprache zu einer anderen Sprache
- 14. Können Sie die Same-Origin-Richtlinie strenger festlegen?
- 15. Norwegische Sprache in Zend
- 16. Zuweisungsoperator in Go Sprache
- 17. Zeitzonennamen in lokaler Sprache
- 18. Ausführungszeit in C-Sprache
- 19. Zuordnung in R-Sprache
- 20. Sprache ändern in C#
- 21. Sternzeichen in Ausdruck Sprache
- 22. Init in Swift Sprache
- 23. Sprache ändert in ui.bootstrap.datepicker
- 24. Fakultät in D Sprache
- 25. In-Sprache semantische Varianz
- 26. Beobachtermuster in Go Sprache
- 27. Looping in Q Sprache
- 28. Text-in-Sprache in Emacs
- 29. Sprache für Text in Sprache von meiner App herunterladen
- 30. Sprache ändern
Also, nein - es ist nicht auf eine rein strikte Weise möglich. Da alle funktionalen Sprachen ein Konzept der Faulheit haben (meist unter Verwendung von Funktionen, Closures und Variablen), ist es in "strengen Sprachen" über faule Konstrukte möglich. –
Oft ist die Faulheit schon da, aber wenn deine Monade hinter einem abstrakten Typ steht, lässt OCaml dich nicht ausnutzen - 'Diese Art von Ausdruck ist nicht erlaubt als rechte Seite von 'let rec''. Sie müssen in solchen Fällen für falsche "Einheits" -Argumente gehen (oder vielleicht "faul", wenn Sie Memoization benötigen ...) – lukstafi