Pregunta

Conozco a un montón de Java personas han comenzado a buscar en la Scala, ya que se ejecuta en la JVM, y un montón de gente en el mundo de Microsoft está buscando en F#, pero ¿qué Ruby tiene como funcional natural sucesor?

En un puro FP sentido Ruby no le falta de nada, sino que tiene mucho que algunos pueden decir.Un lenguaje funcional obliga al programador a no usar variables globales y otros modismos tanto (aunque es posible el uso de variables globales en los lenguajes funcionales)

¿Fue útil?

Solución

Hay dos muy diferentes definiciones de lo que es "programación funcional" significa.Usted puede tipo de hacer el uno en Ruby, pero no puede hacer el otro.

Estas dos definiciones son:

  • con la programación de primera clase de las funciones y
  • programación con funciones matemáticas

Usted puede tipo de programa con primera clase de funciones en Ruby.Tiene soporte para los de primera clase de funciones.De hecho, se ha demasiado apoyo para ellos:hay Proc.new, proc, lambda, Method, UnboundMethod, bloques, #to_proc y ->() (y probablemente algunos otros que se me olvida).

Todos estos comportarse de manera ligeramente diferente, han sintaxis diferente, comportamiento ligeramente diferente y ligeramente diferentes restricciones.Por ejemplo:el único de estos que sintácticamente es lo suficientemente ligero que usted puede utilizar realmente ajustadamente, está a unas cuadras.Pero los bloques de tener alguna de las más severas restricciones:sólo se puede pasar de un bloque a un método, los bloques no son objetos (que en un lenguaje orientado a objetos en el que "todo es un objeto" es un muy una restricción severa) y al menos en Ruby 1.8 también hay algunas restricciones w.r.t parámetros.

Referirse a un método es otra cosa que es bastante torpe.En Python o ECMAScript por ejemplo, solo puedo decir baz = foo.bar para referirse a la bar método de la foo objeto.En Ruby, foo.bar es un método llame, si me quiero referir a la bar método de foo, Tengo que decir baz = foo.method(:bar).Y si ahora quiero llame ese método, no me lo acaba de decir baz(), Tengo que decir baz.call o baz[] o (en Ruby 1.9) baz.().

Así, en primer lugar-funciones de clase en Ruby no realmente de primera clase.Ellos son mucho mejores que los de segunda clase, y que son lo suficientemente bueno™, pero no son completamente de primera clase.

Pero en general, Rubyists no deje de Ruby sólo para la primera clase de funciones.Ruby soporte es lo suficientemente bueno que las ventajas que se podrían obtener a partir de un mejor apoyo en otro idioma, generalmente es consumido por el esfuerzo de formación para el nuevo idioma o por algo otra cosa que usted está acostumbrado a que ahora debe renunciar.Como, por ejemplo RubyGems o apretado Unix integración o Ruby on Rails o de sintaxis o de ...

Sin embargo, la segundo definición de FP es donde Ruby se cae en su cara.Si usted desea hacer la programación con funciones matemáticas en Ruby, que en un mundo de dolor.Usted puede utilizar la mayoría absoluta de las bibliotecas de Ruby, porque la mayoría de ellos son de estado, effectful, fomentar la mutación o de lo contrario de lo impuro.Usted no puede usar la biblioteca estándar por las mismas razones.Usted no puede usar la biblioteca principal.Usted puede utilizar cualquiera de los tipos de datos básicos, porque todos ellos son mutables.Usted podría simplemente decir "no me importa que ellos son mutables, yo simplemente no mutar y hacer siempre copia de ellos", pero el problema es:alguien todavía puede mutar ellos.También, porque son mutables, Ruby no puede optimizar la copia y el recolector de basura no está en sintonía para ese tipo de carga de trabajo.

Simplemente no funciona.

También hay un par de características que tienen realmente nada que ver con la programación funcional, pero que la mayoría de los lenguajes funcionales tienden a tener, que Ruby es la que falta.La coincidencia de patrones, por ejemplo.La pereza también no era fácil de lograr antes de Enumerators fueron más agresivamente utilizado en Ruby 1.9.Y todavía hay algunas cosas que las obras con estricta Enumerables o Arrays, pero no con los perezosos Enumerators, aunque no hay realmente ninguna razón para que ellos requieren rigurosidad.

Y para este definición de FP, definitivamente tiene sentido dejar detrás de Ruby.

Los dos principales idiomas que Rubyists han acudido en masa a, se Erlang y Clojure.Estos son relativamente buenos partidos para Ruby, debido a que ambos son dinámicamente tipado, tienen una similar REPL la cultura como el Rubí, y (esto es más un Rieles cosa que un Rubí cosa) también son muy buenas en la web.Tienen todavía bastante pequeña y comunidades de acogida, el idioma original de los creadores todavía están activos en la comunidad, hay un fuerte énfasis en hacer de nuevo, emocionante y tenso cosas, todos de los cuales son los rasgos que la comunidad de Ruby también tiene.

El interés en Erlang empezar, cuando alguien mostró el original de 1993 vídeo de introducción "Erlang:La Película"en RubyConf de 2006.Una pareja de alto perfil Rieles de proyectos que se iniciaron el uso de Erlang, por ejemplo PowerSet y GitHub.Erlang es también fácil de dominar para Rubyists, porque no se lleva a la pureza tan lejos como Haskell o Limpia.El dentro de de un actor es bastante pura, pero el acto de enviar mensajes a sí mismo es, por supuesto, un efecto secundario.Otra cosa que hace de Erlang fáciles de entender, es que los Actores y los Objetos son en realidad la misma cosa, cuando usted siga Alan Kay de la definición de la programación orientada a objetos.

Clojure ha sido una adición reciente a la Rubyist del cinturón de herramientas.Su popularidad se creo principalmente por el hecho de que la comunidad de Ruby finalmente se ha calentado a la idea de que JVM ≠ Java y se abrazaron JRuby y entonces comenzó a mirar a su alrededor lo que otros cosas interesantes que había en la JVM.Y de nuevo, Clojure es mucho más pragmático que el de otros lenguajes funcionales como Haskell y otros Balbucea como Esquema de y mucho más simple y más moderno que el CommonLisp, por lo que es un ajuste natural para Rubyists.

Otra cosa interesante acerca de Clojure es que debido a que ambos Clojure y Ruby ejecuta en la JVM, usted puede combinar ellos.

El autor de "Programación De Clojure"(Stuart Halloway) es un (ex?) Rubyist, por ejemplo, como es Phil Hagelberg, el autor de la Leiningen herramienta de construcción de Clojure.

Sin embargo, Rubyists también están mirando a ambos Scala (como uno de los más pragmático de tipo estático FP idiomas) y Haskell (como uno de los más elegante).A continuación, hay proyectos como Scuby y La arrogancia que son los puentes que permiten integrar a Ruby con Scala y Haskell, respectivamente.Twitter la decisión de trasladar parte de su bajo nivel de infraestructura de mensajería primera de MySQL a Ruby, luego de Ruby a Scala es también bastante conocidos.

F# no parecen jugar ningún papel en absoluto, posiblemente debido a un miedo irracional hacia todas las cosas de Microsoft la comunidad de Ruby tiene.(Que, por CIERTO, parece que en su mayoría carecen de fundamento, dado que el equipo de F# ha siempre versiones disponibles para el Mono.)

Otros consejos

Java personas están utilizando un lenguaje en la JVM y quieren un uno más funcional compatible con su tiempo de ejecución, por lo que ir a la Scala.

C # personas están utilizando un lenguaje en el CLR y quieren un uno más funcional compatible con su tiempo de ejecución, por lo que ir a F #.

Rubí personas están utilizando un lenguaje que ya es bastante funcional, y lo están utilizando en una serie de tiempos de ejecución subyacentes (JRuby, IronRuby, MRI, MacRuby, Rubinius, etc ...). Yo no creo que tenga un sucesor natural funcional, o incluso las propias necesidades.

Cualquier versión de Lisp debe estar bien.

Rubí sí mismo es un tipo de lenguaje de programación funcional, así que no ven dialectos especiales del FP usando rubí.

En el nivel bombo, Haskell.

Suponiendo que la gente Ruby no sólo tiene que ir a la JVM sí, creo que la mayoría estaría de adoptar Erlang, siendo otro lenguaje de tipos dinámicos.

Ruby no es tan funcional como decir Lisp, pero es suficiente sólo funcional que se puede hacer un poco de programación funcional en una buena manera divertida. (A diferencia de tratar de hacer la programación funcional en algo así como C #)

Además, en realidad le obliga a paradigmas funcionales en algunos de su sintaxis, tales como el uso intensivo de los bloques y el rendimiento. (Que me enamoré después de enterarse de Ruby).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top