Ich lerne Javascript FP, indem ich DrBooleans Buch lese .
Ich suchte nach einer funktionalen Programmierbibliothek. Ich habe Ramda und Folktale gefunden. Beide behaupten, eine funktionale Programmierbibliothek zu sein.
Aber sie sind so unterschiedlich:
Ramda scheint Utility-Funktionen für den Umgang mit Listen zu enthalten: Map, Reduce, Filter und reine Funktionen: Curry, Compose. Es enthält nichts, was mit Monade, Funktor zu tun hätte.
Folktale enthält jedoch kein Dienstprogramm für Listen oder Funktionen. Es scheint einige algebraische Strukturen in Javascript wie Monade zu implementieren: Vielleicht, Aufgabe ...
Eigentlich habe ich mehr Bibliotheken gefunden, sie scheinen alle in die beiden Kategorien zu fallen. Unterstrich und Lodash sind wie Ramda. Fantasy-Land, Pointfree-Fantasy sind wie Märchen.
Können diese sehr unterschiedlichen Bibliotheken beide als funktional bezeichnet werden , und wenn ja, was macht jede Bibliothek zu einer funktionalen Bibliothek?
quelle
[1,2,3].map(fnSquare).reduce(fnSum)
2. weitgehend akademische Y-Kombinator-ähnliche Strukturen "look ma no var ". 3. VerwendenFunction.prototype
, um das Verhalten anderer Funktionen zu ändern, wievar isMissingID=fnContains.partial("id").negate();
Antworten:
Funktionsmerkmale
Es gibt keine klare Grenze für die Definition der funktionalen Programmierung oder einer funktionalen Bibliothek. Einige Funktionen funktionaler Sprachen sind in Javascript integriert:
Andere sind in Javascript mit einiger Sorgfalt möglich:
Wieder andere sind Teil von ES6 und derzeit teilweise oder vollständig verfügbar:
Und es gibt viele andere, die außerhalb der normalen Reichweite von Javascript liegen:
Eine Bibliothek kann dann auswählen, welche Arten von Funktionen sie unterstützen möchte, und dennoch vernünftigerweise als "funktional" bezeichnet werden.
Fantasy-Land-Spezifikation
Fantasy-Land ist eine Spezifikation für eine Reihe von Standardtypen, die von der mathematischen Kategorietheorie und der abstrakten Algebra bis zur funktionalen Programmierung portiert sind, wie Monoid , Functor und Monad . Diese Typen sind ziemlich abstrakt und erweitern möglicherweise bekanntere Begriffe. Funktoren sind beispielsweise Container, die
map
mit einer Funktion überfahren werden können, so wie ein Array mitmap
überfahren werden kannArray.prototype.map
.Märchen
Folktale ist eine Sammlung von Typen, die verschiedene Teile der Fantasy-Land-Spezifikation implementieren, sowie eine kleine Sammlung von begleitenden Dienstprogrammfunktionen. Diese Typen sind Dinge wie Vielleicht , Entweder , Aufgabe (sehr ähnlich zu dem, was anderswo als Zukunft bezeichnet wird, und ein rechtmäßigerer Cousin eines Versprechens) und Validierung
Folktale ist vielleicht die bekannteste Implementierung der Fantasy-Land-Spezifikation und wird sehr geschätzt. Es gibt jedoch keine endgültige oder Standardimplementierung. Fantasy-Land spezifiziert nur abstrakte Typen, und eine Implementierung muss natürlich solche konkreten Typen erzeugen. Der Anspruch von Folktale, eine funktionale Bibliothek zu sein, ist klar: Es bietet Datentypen, die typischerweise in funktionalen Programmiersprachen zu finden sind und die das funktionale Programmieren wesentlich erleichtern.
Dieses Beispiel aus der Folktale-Dokumentation ( Hinweis : nicht in neueren Versionen der Dokumente) zeigt, wie es verwendet werden kann:
Ramda
Ramda (Haftungsausschluss: Ich bin einer der Autoren) ist eine ganz andere Art von Bibliothek. Es werden keine neuen Typen für Sie bereitgestellt. 1 Stattdessen bietet es Funktionen, die die Bedienung vorhandener Typen erleichtern. Es basiert auf dem Gedanken, kleinere Funktionen zu größeren zusammenzusetzen, mit unveränderlichen Daten zu arbeiten und Nebenwirkungen zu vermeiden.
Ramda arbeitet insbesondere mit Listen, aber auch mit Objekten und manchmal mit Strings. Es delegiert auch viele seiner Aufrufe so, dass es mit Folktale oder anderen Fantasy-Land-Implementierungen zusammenarbeitet. Zum Beispiel
map
funktioniert Ramdas Funktion ähnlich wie die aufArray.prototype
, alsoR.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Da Folktale'sMaybe
jedoch die Fantasy-Land-Functor
Spezifikation implementiert , die auch die Karte spezifiziert, können Sie auch Ramdasmap
damit verwenden:Ramdas Anspruch, eine funktionale Bibliothek zu sein, besteht darin, das Erstellen von Funktionen zu vereinfachen, Ihre Daten niemals zu mutieren und nur reine Funktionen zu präsentieren. Typische Verwendung von Ramda wäre der Aufbau komplexerer Funktionen durch Zusammensetzen kleinerer, wie in einem Artikel über die Philosophie von Ramda zu sehen ist
Andere Bibliotheken
Das ist nicht wirklich genau. Erstens ist Fantasy-Land einfach eine Spezifikation, die Bibliotheken für verschiedene Typen implementieren können. Folktale ist eine von vielen Implementierungen dieser Spezifikation, wahrscheinlich die am besten abgerundete, sicherlich eine der ausgereiftesten. Pointfree-Fantasy und Ramda-Fantasy sind andere, und es gibt noch viele mehr .
Unterstrich und Lodash sind oberflächlich wie Ramda, da sie Grab-Bag-Bibliotheken sind und eine große Anzahl von Funktionen mit viel weniger Zusammenhalt bieten als so etwas wie Folktale. Und selbst die spezifischen Funktionen überschneiden sich häufig mit denen von Ramda. Auf einer tieferen Ebene hat Ramda jedoch ganz andere Bedenken als diese Bibliotheken. Ramda engsten Verwandten sind wahrscheinlich Bibliotheken wie FKIT , Fnuc und Wu.js .
Bilby gehört zu einer eigenen Kategorie und bietet sowohl eine Reihe von Tools wie die von Ramda als auch einige Typen, die mit Fantasy-Land übereinstimmen. (Der Autor von Bilby ist auch der ursprüngliche Autor von Fantasy-Land.)
Ihr Anruf
Alle diese Bibliotheken haben das Recht, als funktional bezeichnet zu werden, obwohl sie sich in ihrem funktionalen Ansatz und dem Grad des funktionalen Engagements stark unterscheiden.
Einige dieser Bibliotheken arbeiten tatsächlich gut zusammen. Ramda sollte gut mit Folktale oder anderen Fantasy-Land-Implementierungen funktionieren. Da sich ihre Bedenken kaum überschneiden, stehen sie wirklich nicht in Konflikt, aber Ramda tut gerade genug, um die Interaktion relativ reibungslos zu gestalten. Dies gilt wahrscheinlich weniger für einige der anderen Kombinationen, die Sie auswählen können, aber die einfachere Funktionssyntax von ES6 kann auch die Integration erleichtern.
Die Wahl der Bibliothek oder sogar Stil der Bibliothek zu verwenden, wird auf Ihrem Projekt und Ihre Vorlieben ab. Es gibt viele gute Optionen, und die Anzahl wächst, und viele von ihnen verbessern sich erheblich. Es ist ein guter Zeitpunkt, um funktionale Programmierung in JS durchzuführen.
1 Nun, es gibt ein Nebenprojekt, eine Ramda-Fantasie , die etwas Ähnliches wie Folktale macht, aber nicht Teil der Kernbibliothek ist .
quelle
yield
macht es einfacher, die vonLazy
oder durchgeführten faulen Listenverarbeitungen durchzuführenlz.js
. Aber es hilft nicht bei Faulheit auf Sprachniveau.someFunc(a + b)
In JS werden zuerst die Werte von hinzugefügta
undb
dann das Ergebnis als Parameter an someFunc übergeben. Das Äquivalent in Haskell macht das nicht. Wenn die aufgerufene Funktion diesen Wert niemals verwendet, führt sie niemals die Addition durch. Wenn es irgendwann verwendet wird, wird es als Ausdruck betrachtet, der berechnet wird, bis das Ergebnis benötigt wird. Wenn Sie niemals etwas tun, das es erzwingt (wie E / A), wird die Berechnung niemals tatsächlich durchgeführt.