Wenn Java Menschen zu Scala gehen, gehen C # F #, wo für funktionelle Nirwana gehen Ruby-Leute? [geschlossen]

StackOverflow https://stackoverflow.com/questions/2254368

Frage

Ich kenne eine Menge von Java Menschen begonnen hat, im Scala suchen, da es auf der JVM läuft, und eine Menge Leute in der Microsoft-Welt wird bei F # suchen, aber was Rubin hat als natürlichen Funktions Nachfolger?

In einem reinen FP Sinne Rubin nichts fehlt, stattdessen hat es zu viel sagen, einige können. Eine funktionale Sprache zwingt den Programmierer keine globalen Variablen und andere Idiome verwenden so viel (obwohl es möglich ist Globals in funktionalen Sprachen zu verwenden)

War es hilfreich?

Lösung

Es gibt zwei sehr verschiedene Definitionen dessen, was „funktionale Programmierung“ bedeutet. Sie können Art-of tun, um die man in Ruby, aber Sie können die anderen nicht tun.

Diese beiden Definitionen sind:

  • Programmieren mit First-Class-Funktionen und
  • Programmieren mit mathematischen Funktionen

Sie können Art-of-Programm mit erstklassigen Funktionen in Ruby. Es hat Unterstützung für erstklassige Funktionen. In der Tat, es hat zu viel Unterstützung für sie. Es ist Proc.new, proc, lambda, Method, UnboundMethod, Blöcke, #to_proc und ->() (und wahrscheinlich auch einige andere, die ich vergessen)

Alle diese verhalten sich etwas anders , haben leicht unterschiedliche Syntax, leicht unterschiedliches Verhalten und etwas andere Einschränkungen. Zum Beispiel: das nur eine davon, die syntaktisch leicht genug ist, dass man es tatsächlich dicht verwenden kann, ist blockiert. Aber Blöcke einige ziemlich strenge Beschränkungen haben: Sie haben nur einen Block ein Verfahren passieren können, Blöcke sind nicht Objekte (die in einer objektorientierten Sprache in Weicht „alles ein Objekt“ ist ein sehr schweren Einschränkung) und zumindest in Ruby 1.8 gibt es auch einige Einschränkungen bzgl Parameter.

auf ein Verfahren bezieht, ist eine andere Sache, die ziemlich umständlich ist. In Python oder ECMAScript zum Beispiel, kann ich nur sagen, baz = foo.bar zur bar Methode des foo Objekts zu verweisen. In Ruby foo.bar eine Methode Anruf , wenn ich auf die bar Methode von foo beziehen möchten, ich habe baz = foo.method(:bar) zu sagen. Und wenn ich jetzt auf will Anruf diese Methode, kann ich nicht nur baz() sagen, ich muß sagen, baz.call oder baz[] oder (in Ruby 1.9) baz.().

So, First-Class-Funktionen in Ruby sind nicht wirklich erstklassig. Sie sind viel besser als zweite Klasse, und sie sind gut genug ™, aber sie sind nicht ganz erstklassig.

Aber im Allgemeinen Rubyisten nicht verlassen Rubin nur für erstklassige Funktionen. Ruby-Unterstützung ist gut genug, dass alle Vorteile, die Sie von einem besseren Unterstützung in einer anderen Sprache gewinnen könnten in der Regel durch den Schulungsaufwand für die neue Sprache oder von etwas anders aufgegessen, den Sie sind es gewohnt, dass Sie muss jetzt geben Nach oben. Wie, sagt RubyGems oder enge Unix-Integration oder Ruby on Rails oder Syntax oder ...

Allerdings ist die zweiten Definition von FP ist, wo Rubin flach auf sein Gesicht fällt. Wenn Sie die Programmierung mit mathematischen Funktionen in Ruby tun wollen, sind Sie in einer Welt des Schmerzes. Sie können nicht die absolute Mehrheit von Ruby-Bibliotheken verwenden, weil die meisten von ihnen sind Stateful, effekt, fördern Mutation oder anderweitig unrein. Sie können nicht die Standard-Bibliothek aus den gleichen Gründen verwenden. Sie können nicht die Core-Bibliothek verwenden. Sie können nicht von den Kerndatentypen verwenden, weil sie alle wandelbar sind. Man könnte sagen, nur „Mir ist es egal, dass sie wandelbar sind, werde ich sie einfach nicht mutieren und immer kopieren“, aber das Problem ist: jemand anderes sie noch mutieren kann. Auch, weil sie wandelbar sind, Rubin nicht optimiert die das Kopieren und die Garbage Collector nicht für diese Art von Arbeitsbelastung abgestimmt.

Es funktioniert einfach nicht.

Es gibt auch ein paar Features, die wirklich nichts mit der funktionalen Programmierung zu tun, sondern dass die meisten funktionalen Sprachen zu haben, neigen dazu, dass Ruby fehlt. Musterabgleich, zum Beispiel. Laziness war auch nicht so leicht zu erreichen, bevor Enumerators mehr wurden verwendet, um aggressiv in Ruby 1.9. Und es gibt noch einige Dinge, die mit strengen Enumerables oder Arrays aber nicht mit faulem Enumerators funktioniert, obwohl es‘ist eigentlich kein Grund für sie zu erfordert Strikt.

Und für diese Definition von FP, macht es durchaus Sinn hinter Ruby zu lassen.

Die beiden Hauptsprachen dass Rubyisten wurden Beflockung sind Erlang und Clojure . Diese sind beide relativ gute Spiele für Ruby, weil sie beide dynamisch typisierte, haben eine ähnliche REPL Kultur wie Ruby und (das ist mehr eine Rails Sache als eine Ruby-Sache) sind auch sehr gut im Internet. Sie haben immer noch ziemlich klein und einladende Gemeinden, die Originalsprache Schöpfer sind immer noch aktiv in der Gemeinde gibt es einen starken Fokus auf tun neue, spannende und edgy Dinge, von denen alle Merkmale sind, dass die Ruby-Community hat auch.

Das Interesse an Erlang gestartet, wenn jemand das Original 1993 Einführung Video zeigte „ Erlang: The Movie "bei RubyConf 2006. ein paar hochkarätigen Rails-Projekten gestartet Erlang, beispielsweise PowerSet und GitHub . Erlang ist auch einfach zu meistern für Rubyisten, weil es nicht Reinheit dauert ganz so weit wie Haskell oder Sauber . Die innen von Schauspielern ziemlich rein ist, sondern der Akt der Nachrichten selbst zu senden ist natürlich Nebenwirkung. Eine andere Sache, die Erlang leicht zu verstehen macht, ist, dass Schauspieler und Objekte sind eigentlich die gleiche Sache, wenn Sie folgen Alan Kay Definition der objektorientierten Programmierung .

Clojure hat eine neue Ergänzung der toolbelt der Rubyist. Seine Popularität ich hauptsächlich durch die Tatsache getrieben vermuten, dass die Ruby-Community schließlich auf die Idee, dass JVM ≠ Java erwärmt hat und umarmte JRuby und sie begannen dann schauen sie sich um, was em <> andere interessante Sachen gab es auf der JVM. Und wieder ist Clojure viel pragmatischer als die beiden anderen funktionalen Sprachen wie Haskell und andere Lisps wie Scheme und viel einfacher und moderner als CommonLisp, so dass es eine natürliche Ergänzung für Rubyisten ist.

Eine andere kühle Sache über Clojure ist, dass, weil beide Clojure und Ruby laufen auf der JVM, können Sie kombinieren sie.

Der Autor von " Programmierung Clojure " (Stuart Halloway) ist ein (ehemaliger ?) Rubyist zum Beispiel wie Phil Hagelberg , der Autor des Leiningen Build-Tool für Clojure.

Allerdings Rubyisten suchen auch an beiden Scala (als einer der pragmatischere statisch typisierte FP Sprachen) und Haskell (als eine der elegantere sind). Dann gibt es Projekte wie Scuby und Hybris , die Brücken, die Sie Ruby Scala und Haskell integrieren lassen, respectively. Twitter Entscheidung einen Teil ihrer Low-Level-Messaging-Infrastruktur zunächst von MySQL nach Ruby, dann von Ruby nach Scala zu bewegen ist auch ziemlich allgemein bekannt.

F # keine Rolle überhaupt zu spielen scheint, möglicherweise aufgrund einer irrationalen Angst gegenüber allen Dingen Microsoft die Ruby-Community hat. (Was scheint BTW, meist unbegründet, da das F # Team hat immer zur Verfügung gestellt Versionen für Mono.)

Andere Tipps

Java Menschen verwenden eine Sprache auf der JVM und wollen einen funktionellen eine kompatibel mit ihrer Laufzeit, so dass sie zu Scala gehen.

C # Menschen mit einer Sprache, auf der CLR und wollen, dass ein funktionellen eine kompatibel mit ihrer Laufzeit, so dass sie zu F # gehen.

Ruby-Leute verwenden eine Sprache, die schon ziemlich funktional ist, und sie verwenden es auf einer Reihe von zugrunde liegenden Runtimes (JRuby, IronRuby, MRI, MacRuby, Rubinius, etc ...). Ich glaube nicht, dass es einen natürlichen funktionellen Nachfolger hat, oder sogar brauche man.

Jede Version von Lisp sollte in Ordnung sein.

Rubin selbst ist eine Art funktionalen Programmiersprache, also ich sehe keine speziellen Dialekte für FP mit Ruby.

In Hype Ebene Haskell.

Unter der Annahme, Ruby-Leute einfach gehen nicht auf die JVM selbst, ich glaube, die meisten Erlang annehmen würde, eine andere dynamisch typisierte Sprache.

Ruby ist nicht so funktionell wie etwa Lisp, aber es ist nur funktionell genug, dass Sie einige der funktionalen Programmierung in einer guten unterhaltsame Art und Weise zu tun. (Im Gegensatz zu versuchen, funktionale Programmierung in so etwas wie C # zu tun)

Außerdem ist es zwingt SieFormal tatsächlich in funktionale Paradigmen in einige seine Syntax, wie die starke Nutzung von Blöcken und Ertrag. (Welche fiel ich in der Liebe mit nach Ruby-Lernen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top