2008-10-17 23 views
10

¿Puede Ruby realmente utilizarse como un lenguaje funcional? ¿Cuáles son algunos buenos tutoriales para enseñar esta faceta del idioma? Nota: Realmente quiero usar y mantener Ruby como mi idioma principal, así que no estoy interesado en este momento en convertirme a YAFL (otro idioma funcional). Estoy realmente interesado en qué tan bien funcionan las facetas funcionales de Ruby en comparación con la línea base del lenguaje funcional estándar. Gracias.¿Se puede usar realmente Ruby como lenguaje funcional?

Respuesta

4

Depende de lo que quiere decir con "Programación funcional". En mi opinión, lo más importante es que las funciones son first class values, y en este sentido Ruby es un lenguaje funcional.

12

Sí ... más o menos. Ruby carece de una construcción razonable para hacer cumplir la inmutabilidad. (Object#freeze no cuenta) La inmutabilidad es realmente la piedra angular de los lenguajes funcionales. Además, las bibliotecas centrales de Ruby están altamente orientadas hacia el diseño imperativo. Sus clases Array y Hash son ambas variables por naturaleza, incluso String tiene métodos que no son inmutables (por ejemplo, gsub!). Irónicamente, Java es más "funcional" que Ruby en este aspecto.

Dicho esto, es posible hacer una programación funcional en Ruby. Cada vez que utiliza un bloque/proc/lambda, está utilizando una función que proviene de la programación funcional. Del mismo modo, los métodos de recopilación como map y zip también son construcciones de orden superior que tienen sus raíces en lenguajes como Lisp, ML y Haskell.

Si realmente quieres hacer una programación funcional, querrás utilizar un lenguaje más orientado a ese género. Algunas sugerencias:

  • Clojure - Ya que formul la pregunta usando Ruby, que supongo que eres de la persuasión de tipos dinámicos. Clojure es como un Lisp estrictamente funcional que se ejecuta en la JVM.
  • F# - Básicamente OCaml en el CLR. Muy bonito, muy limpio
  • Scala - No es un lenguaje funcional estrictamente, pero mucho mejor para él que Rubí
  • Haskell - favorito de todos!

Notarás que tres de estos cuatro idiomas están tipados estáticamente. De hecho, en el caso de Scala y Haskell, estos son muy lenguajes tipados estáticos (sistemas de tipo mucho más fuertes que, por ejemplo, Java). No estoy seguro de por qué esta es una tendencia en los lenguajes funcionales, pero ahí lo tienes.

+1

@ Daniel Spiewak - argh me ganas! Tienes que ser rápido en este lugar ;-) – johnstok

+0

jaja. Tengo suerte, supongo. :-) ¡Mejor suerte la próxima vez! –

+0

Estoy de acuerdo, si uno realmente quiere aprender funcional debería probar Haskell. – Jonke

2

Tiene un conjunto bastante completo de listas de comprensión - ver Martin Fowler's article. Sin embargo, su sistema de tipos no es tan poderoso como los gustos de Haskell. Además, su enfoque no está en la inmutabilidad, como es típico de los lenguajes funcionales.

0

Para la mayoría de los usos, sí. Hay (aunque algo limitada) la capacidad de currying, funciones de primera clase y recursión. Pero debido al alto costo de creación de objetos y despacho de métodos, ¡la recursión profunda puede ocasionarle problemas rápidamente!

Ruby es capaz de adaptarse a una gran variedad de "moldes" de programación, pero ciertamente no es óptimo en la mayoría de ellos.

-4

Eche un vistazo a Haskell. Es un lenguaje funcional que sintácticamente es muy similar a Ruby.

0

También se encontrará con problemas con bastante rapidez si está utilizando algún tipo de algoritmo recursivo. Ruby no es compatible con la recursividad de la cola, por lo que si no puede utilizar la recursión de manera confiable como una técnica de iteración como lo haría como la forma natural de hacer las cosas en un lenguaje más funcional. Algo así como:

def foo(n) 
    puts n 
    foo(n + 1) 
end 

foo(1) 

le dará

SystemStackError: stack level too deep 
    from (irb):2:in `puts' 
    from (irb):2:in `foo' 
    from (irb):3:in `foo' 
    from (irb):5 

Después de unos pocos miles de iteraciones (dependiendo de su sistema)

+0

Su ejemplo sería mejor si realmente tuviera una condición para ramificarse fuera de la recursión. Ninguna máquina puede usar la recursión indefinidamente. – fooledbyprimes

+0

Con la eliminación adecuada de la llamada de cola, está efectivamente creando un ciclo while, y así puede usar la recursión indefinidamente. Así es como ' d Implementar un bucle infinito, por ejemplo en Scheme. El ejemplo anterior es obviamente ideado. – apg

+0

No "c" tiene recursividad? No llamaría a "c" un lenguaje funcional, por lo tanto, la recursividad sola no define un lenguaje como "funcional". " – fooledbyprimes

Cuestiones relacionadas