Angesichts der Tatsache, dass Ruby über gute Funktionen für den Listenbetrieb verfügt - Reduzieren, Zuordnen, Auswählen, Sammeln usw. Es verfügt über Procs, Blocks und Lambdas sowie eine gute Iterationsunterstützung (die each
Familie). Wäre es eine schlechte Entwurfsentscheidung, wenn ich es versuche ? alle meine Ruby-Sachen so rein funktional wie möglich schreiben? Besonders für Code mit wenig oder keiner E / A (also weniger offensichtliche Nebenwirkungen)?
Ich habe Haskell gelernt (die "echte" Hackersprache genannt) und bin verliebt in seine Art, Dinge zu tun - ich liebe Ruby, aber ich denke, es kann noch mehr Spaß machen, wenn mehr Haskell-Geist hineinfließt (na ja, nicht Ruby leiht sich überhaupt nichts aus / lernt viel daraus?)
Konstruktive Anleitung ist willkommen ...
quelle
Antworten:
Ich habe das mit Python gemacht. Ich finde es umständlich, in einem erblich reinen Funktionsstil in einer Sprache zu schreiben , die nicht dafür entwickelt wurde. Vergleichen Sie beispielsweise die beiden Definitionen von in_order :
Das Schreiben
in_order
der Haskell-Methode in Python wird sowohl ausführlich (da Python die erforderlichen Redewendungen nicht sehr gut unterstützt) als auch langsam (linearer Raum anstelle von Haskells konstantem Raum aufgrund von Faulheit) sein.Es ist mir jedoch gelungen, Python-Programme mit funktionaler Organisation und einer idiomatischen Implementierung jeder Funktion zu erstellen . Die Idee, dass dies eine gute Art zu programmieren ist, ist eigentlich die These hinter meinem Codekatalog- Projekt. Meine Komponenten orientieren sich also an Abstraktionen und Funktionen (mit reiner Schnittstelle ), die auf ihnen ausgeführt werden, und nicht an Klassen mit Status, und sie passen gut zusammen. Tatsächlich scheint auf diese Weise organisierter Code flexibler wiederzuverwenden zu sein als mit Klassen organisierter Code. Das könnte jedoch eine persönliche Voreingenommenheit sein, da ich immer noch ein Haskell-Anhänger bin.
Ich würde also sagen, dass die Antwort auf Ihre Frage irgendwie ist . Verwenden Sie Ihre funktionalen Wurzeln, um zu denken, aber übertreiben Sie es nicht. Z.B. Das Simulieren von faulen Listen in Ruby nur um der Redewendung willen wird wahrscheinlich mehr Ärger bedeuten, als es wert ist.
quelle
and
verbraucht hat. es wird sich wie eine Schleife verhalten. Während Pythons Vergleichsliste vollständig erstellt werden muss, bevor das Analogon vonand
sie sehen kann (es sei denn, Sie verwenden Generatoren ... was ich für möglich halte).Sie können Ruby-Code im funktionalen Stil schreiben, als wäre es Schema, nicht Haskell. Um es so zu schreiben, als wäre es Haskell, würde es ein Haskell-ähnliches System sowie eine allgegenwärtige faule Auswertung benötigen.
quelle
Ich habe festgestellt, dass das Verständnis der funktionalen Programmierung und insbesondere von Haskell in bestimmten Situationen, die ich in Ruby erlebt habe, hilfreich für mich ist. Aber je mehr ich Haskell lerne, desto mehr wird mir klar, wie weit Ruby davon entfernt ist, jemals Haskell sehr ähnlich zu sein.
Die Situation beim Laden von Modulen / Codes ist zum einen miserabel. Der aktuelle Interpreter hat keine Tail-Call-Optimierung aktiviert, sodass Sie die Rekursion nicht wie in Haskell verwenden können. Und wenn Sie erst einmal in Monaden sind, gibt es wirklich keinen Vergleich der Abstraktionsebenen, die Sie in Haskell vs. Ruby erreichen können.
Wenn Sie interessiert sind, habe ich während des Lernens einen Ruby / Haskell-Vergleichscode auf gist.github.com veröffentlicht .
Die Technik, die ich Ruby gebracht habe und die am besten funktioniert hat, bestand darin, reine Funktionen zu finden, wo ich kann. So klingt es, als würden Sie versuchen, dies zu tun.
quelle
self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])
. Es gibt überhaupt keinen Grund, warum Sie Monaden nicht bewusst verwenden können, anstatt sie zu verwenden, ohne zu wissen, dass Sie sie verwenden (wie Listen).Ich würde Ja sagen". Was (ich denke) Sie sprechen, ist der funktionale Programmiereinfluss in der Ruby-Sprache. Das Funktionsparadigma hat einige wirklich schöne Konzepte, die sich mit objektorientierten ergänzen oder überschneiden (insbesondere keine Nebenwirkungen).
Das Tolle an Ruby ist, dass Sie damit in einem linearen, objektorientierten oder funktionalen Stil oder einer Mischung aus diesen codieren können. Und Ihr einfaches, lineares Skript kann sich in einen OO / Funktionsstil verwandeln, wenn die Komplexität zunimmt.
quelle
Es hängt davon ab, ob Sie mit anderen zusammenarbeiten. Wenn Sie selbst am Code arbeiten, verwenden Sie den Stil, mit dem Sie sich am wohlsten fühlen. Wenn Sie jedoch mit anderen Ruby-Programmierern arbeiten, sind diese möglicherweise nicht an einen rein funktionalen Programmierstil gewöhnt und werden daher durch Ihren Code verwirrt. Wenn Ihre Mitarbeiter auch Haskell-Programmierer sind, die auf Ruby migriert sind, liegt dieses Problem möglicherweise nicht vor.
quelle