2013-03-21 6 views
10

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

14

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:

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.

+0

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. –

+0

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