2017-06-13 1 views
0

Ich versuche eine Methode zu finden, um monadische Bibliotheken in TypeScript zu verschönern. Während die Implementierung der Monade selbst angenehm voranschreitet, sieht ihre Verwendung wie die bekannte Callback-Hölle aus.Do-Notation in TypeScript

Ich frage mich, ob es einen Weg gibt, den existierenden synactic synadctic Zucker async zu entführen/erwarten oder yield/for..of, aber ich muss zugeben, dass ich einige Probleme habe, die Punkte zu verbinden. Ist es möglich, diese Konstrukte auf etwas zu verwenden, das weder ein Versprechen noch ein Iterable ist, und so verschieden wie eine Fortsetzungs-Monade, die aus reaktiven Komponenten zusammengesetzt ist?

+1

Können Sie vielleicht etwas Code hinzufügen, um genau zu zeigen, was Sie meinen und uns etwas geben, mit dem wir arbeiten können? –

+0

Ich weiß sehr wenig über TypeScript und wenig JavaScript, aber mayby ​​[this] (https://github.com/Risto-Stevcev/do-notation) ist portabel zu TypeScript? – phg

Antwort

1

Ich bin auf Zeit begrenzt, aber hier ist ein schnelles kleines Beispiel mit der Fortsetzung Monade Cont als Beispiel

// first: WITHOUT do-notation 
 

 
const Cont = f => ({ 
 
    runCont: f, 
 
    chain: g => 
 
    Cont(k => f (x => g (x) .runCont (k))) 
 
}) 
 

 
Cont.of = x => 
 
    Cont(k => k (x)) 
 

 
const result = Cont.of (2) .chain (x => 
 
    Cont.of (3) .chain (y => 
 
    Cont.of (x + y))) 
 

 
result.runCont (console.log) 
 
// 5

Nun ist die gleiche Sache einer Art do -Notation mit - do ist ein reserviertes Schlüsselwort in JS, so nannte ich meine Funktion run

// second: WITH do-notation 
 

 
const run = g => { 
 
    const next = x => { 
 
    let {value, done} = g.next (x) 
 
    return done 
 
     ? value 
 
     : value.chain (next) 
 
    } 
 
    return next (null) 
 
} 
 

 
const Cont = f => ({ 
 
    runCont: f, 
 
    chain: g => 
 
    Cont(k => f (x => g (x) .runCont (k))) 
 
}) 
 

 
Cont.of = x => 
 
    Cont(k => k (x)) 
 

 
const result = run (function*() { 
 
    let x = yield Cont.of (2) 
 
    let y = yield Cont.of (3) 
 
    return Cont.of (x + y) 
 
}()) 
 

 
result.runCont (console.log) 
 
// 5


Warnung: Sie konnte Verwendung async/await aber dann erhalten Sie Ihre Werte innerhalb von Promises stecken - das würde wahrscheinlich unter den meisten Umständen lästig.

+0

Wenn Sie sich wirklich darauf verlassen wollen, sollten Sie eine Fehlerüberprüfung durchführen lassen - im Moment geht es davon aus, dass die ausgegebenen Typen eine "Ketten" -Methode haben. – naomik

+0

Ich denke, Generatorfunktionen funktionieren nicht mit der Liste Monade. Außerdem sind sie zustandsbehaftet und Sie können nicht in Funktionen höherer Ordnung nachgeben, daher keine Karte/Reduktion usw. Aber ich kenne auch keinen besseren Weg. Aber ich werde darüber nachdenken. – ftor