Wäre es in Ordnung, wenn ich beschließe, meinen gesamten Ruby so zu schreiben, als wäre es Haskell?


10

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 eachFamilie). 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 ...


13
Warum dann nicht einfach in Haskell schreiben?

1
Ich würde alleine in Haskell schreiben, aber Ruby ist nicht so schlecht, dass er es verdient, komplett weggeworfen zu werden. Ich mag die Tatsache, dass ich es beim Scripting verwenden kann, und für die vielen schnellen Experimente, die ich gerne zusammen hacke, wenn ich KI-Sachen lerne. Aber wahrscheinlich auch, weil ich gerade angefangen habe, Haskell zu lernen, könnte ich dir irgendwann folgen :-)
nemesisfixx

2
Ich verstehe nicht, warum Sie um die Erlaubnis von Stack Overflow bitten. Wenn Sie Code schreiben, den Sie mit anderen in einem Team teilen möchten, müssen Sie Ihre Codierungsstile trotzdem koordinieren. Was macht es sonst aus?
Mike Daniels

Warum frage ich SO? weil ich die ehrliche Meinung erfahrener Hacker und Programmierer respektiere. Die Verwendung eines rein funktionalen Programmieransatzes kann Vorteile bringen, die erfahrene Köpfe möglicherweise mit mir (und anderen wie mir) teilen können.
Nemesisfixx

In Anbetracht der objektiven Gründe für "Nein" ist dies eine legitime Frage.
Andrew Grimm

Antworten:


16

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 :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Das Schreiben in_orderder 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.


Irgendwie hat mich deine Beschreibung an Pascal denken lassen.
rasjani

@rasjani, oh? Irgendein Grund warum?

Ich weiß nicht, vielleicht passt das mangelnde Verständnis von Englisch oder das, was Sie beschrieben haben, dazu, wie (zumindest) Dinge in Pascal-Einheiten angeordnet / strukturiert wurden. Nur eine Art mentale Verbindung, könnte aufgrund der ersten Option keine wirkliche Verbindung haben;)
rasjani

1
Die Aussage "linearer Raum anstelle von Haskells konstantem Raum aufgrund von Faulheit" ist nicht korrekt. Faulheit impliziert immer noch lineare Ordnung. Ich verstehe Ihren Standpunkt jedoch.

3
@aromero, ich verstehe deine allerdings nicht. Was hat Ordnung damit zu tun? Ständiger Platz kommt von Haskell-Müll, der die Köpfe der Vergleichsliste sammelt, nachdem er sie andverbraucht hat. es wird sich wie eine Schleife verhalten. Während Pythons Vergleichsliste vollständig erstellt werden muss, bevor das Analogon von andsie sehen kann (es sei denn, Sie verwenden Generatoren ... was ich für möglich halte).

7

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.


1

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.


In einem meiner Smalltalk-Tests : 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).
Frank Shearar

0

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.