Ich habe Probleme mit dem Verständnis der Unit-Funktion in JavaScript. Vor allem, weil die Sache, die mich dazu brachte, Monaden zu "bekommen" (oder zumindest dachte ich), das Promise-Objekt war, und wie then
immer eine neue Promise zurückgibt, egal welche Funktion du an then
übergibst, was meines Wissens bind
entspricht oder >>=
in Haskell. Das macht für mich durchaus Sinn, denn es stellt sicher, dass alle Ihre Funktionen sozusagen im "Monaden-Universum" ausgeführt werden.JS Monad Unit-Funktion
Was mich stolpert, ist der Vortrag von Douglas Crockford über Monaden und Gonaden. In seiner Implementierung gibt bind
direkt das Ergebnis der Transformationsfunktion zurück, ohne zu überprüfen, ob das Ergebnis selbst eine Monade ist. Dies kollidiert mit der then
Methode von Promises, da then
IMMER eine neue Promise zurückgibt.
Ein Gedanke war die Aufzugsmethode. Seine Implementierung stellt sicher, dass "Lift" immer eine Monade zurückgibt, und vielleicht wurde then
auf Promise gehoben. Dies würde jedoch bedeuten, dass then !== bind
, und dass Promise irgendwo eine interne Bindung hat.
Meine Intuition ist, dass es mindestens eine Art von Typprüfung in der Bindefunktion geben sollte, die das Ergebnis der Transformation überprüft und ermöglicht, dass eine resultierende Monade durchgelassen wird, aber Nicht-Monaden abfängt und diese weitergibt Einheit wieder, wie 'Lift' tut.
* EDIT
Auch ich habe den Eindruck, dass then
-bind, flatMap, >>=
gleichwertig ist, weil es die Fähigkeit, andere Monaden auszupacken, darunter verschiedene, und diejenigen von seiner eigenen Art. Bei der Suche nach einigen Kategorientheorie-Referenzen in JavaScript wurde flatMap
verwendet, um eine Gruppe von verschachtelten Arrays abzubilden und sie dann um eine Dimension zu reduzieren. Das passt dazu, wie then
auf andere Versprechen wartet, die Sie ihm geben. Aber scheint nicht mit der oben genannten ursprünglichen Implementierung übereinzustimmen. Ich fühle mich verloren.
Kann jemand mit mehr Erfahrung FP etwas Licht auf das, was ich vermisse, oder bin ich einfach zu viel los, und müssen von Anfang an beginnen?
Einige Codebeispiele ...
// Crockford's 'bind'
monad.bind = function(transform) {
// value was passed in through the unit constructor
return transform(value);
}
Mein Problem Bereich
// Set the 'isMonad' prop to be true, for all
// monads made with the MONAD macroid
monad.isMonad = true;
// shouldn't this ALWAYS return a monad?
monad.bind = function(transform) {
var res = transform(value);
return (res && res.isMonad) ? res : unit(res);
}
HINWEIS Ich weiß, ich bin mit der Endfassung seiner Umsetzung nicht vollständig, ich bin nur insbesondere auf die bind-Methode fokussieren.
Die vollständige Umsetzung kann bei
https://github.com/douglascrockford/monad/blob/master/monad.js
aktualisieren
Nachdem ich etwas mehr Forschung gefunden werden, wird >>=
keine Monade Instanz zurückzukehren erforderlich. Bergis Kommentar wirft ein Licht darauf, wie Promise.prototype.then
überladen ist und als eine andere Funktion fungiert, je nachdem, was Sie damit lösen.
Viele Dinge begannen zu klicken, als ich einen Schritt zurücktrat und mir ansah, wie Monaden sich von normalen Funktoren unterscheiden. Die Details sind immer noch etwas verschwommen, aber ich denke, ich bekomme das große Bild.
Ein paar gute Referenzen, die klar den Dunst half,
Dieser ist für einen umfassenden Überblick empfehlen, in menschlichen Worten
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
Lassen Sie sich nicht die Bilder täuschen, dieses war wie Gold für mich. Nicht in JavaScript, aber immer noch sehr informativ über die allgemeinen Konzepte.
Auch diese YouTube-Serie auf Kategorie Theory in JavaScript
https://www.youtube.com/watch?v=-FkgOHvNAU8&list=PLwuUlC2HlHGe7vmItFmrdBLn6p0AS8ALX&index=1
Diese YouTube-Serie Online 'Fun Fun Function' ist wunderbar, ist der Gastgeber einer der besten Lehrer, die ich gefunden habe angerufen. Dieses Video handelt von Monaden und wurde von MrE
vorgeschlagen.
Sehr empfehlenswert !.
https://www.youtube.com/watch?v=9QveBbn7t_c&app=desktop
Diese beiden Referenzen hat Wunder für mich speziell. Hoffnung, die auch allen anderen hilft.
Ich empfehle dringend, ignorieren Sie diese Crockford Talk/Code. Ihr Verständnis von Versprechen ist vernünftig. Du solltest einen * guten * Hinweis darauf finden, dass du Crockfords Rede verwirrend findest, weil er verwirrt ist. –
'dann' ist eine schreckliche Umsetzung einer Monade. Es mischt 'bind' /' chain'/'flatMap'/wie immer man es mit einer normalen' map' bezeichnet, und es akzeptiert auch alle thenables als Rückgabewerte. In Haskell benötigen Sie "isMonad" absolut nicht, da der Compiler bereits überprüft, dass die übergebene Funktion den richtigen Rückgabetyp hat. – Bergi
Fügen Sie eine weitere Empfehlung für "ignorieren Crockford" hinzu. – naomik