¿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
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.
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.
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.
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.
Eche un vistazo a Haskell. Es un lenguaje funcional que sintácticamente es muy similar a Ruby.
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)
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
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
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
- 1. ¿Es Erlang realmente un lenguaje funcional?
- 2. Javascript como un lenguaje funcional
- 3. ¿Haskell es realmente un lenguaje puramente funcional considerando UnpafePerformIO?
- 4. ¿Qué lenguaje de programación funcional debería elegir como primer lenguaje de programación funcional?
- 5. lenguaje de ensamblaje funcional
- 6. Ruby no se puede usar requiere
- 7. ¿El "primer" lenguaje funcional del paciente con amnesia? (Realmente me gusta Clojure ...)
- 8. ¿Qué técnicas de lenguaje funcional se pueden usar en idiomas imperativos?
- 9. ¿Se puede usar realmente CouchDB para una aplicación de escritorio?
- 10. ¿Se puede usar Python como un lenguaje de script efectivo para el entorno de Windows Server?
- 11. Además de un lenguaje declarativo, ¿SQL es un lenguaje funcional?
- 12. ¿XSLT es un lenguaje de programación funcional?
- 13. ¿Se puede usar CRC32 como función hash?
- 14. CMS en el lenguaje de programación funcional
- 15. La "programación funcional" tiene un significado claro, pero ¿el "lenguaje funcional"?
- 16. Ruby vs Lua como lenguaje de scripting para C++
- 17. ¿Qué tan práctico es incorporar el núcleo de un lenguaje con un espacio funcional funcional (como ML) en Haskell?
- 18. estado del desarrollo web utilizando el lenguaje de programación funcional
- 19. ¿Cómo se implementaría el 'Modelo' en una aplicación web Rails en un lenguaje de programación funcional?
- 20. Depuración de un lenguaje de scripting como ruby
- 21. métodos estáticos hacen de Java un lenguaje pseudo funcional?
- 22. ¿Hay algo así como un modelo funcional?
- 23. ¿El rubí es realmente un lenguaje completamente orientado a objetos?
- 24. ¿No se puede usar una matriz como valores predeterminados para Ruby Hash?
- 25. no se puede ejecutar ffmpeg como subproceso en Ruby
- 26. Implementación de ESB (Enterprise Service Bus) en un lenguaje funcional
- 27. ¿Se puede usar punto y coma en Ruby?
- 28. Implementación de un intérprete de subproceso directo en un lenguaje funcional como OCaml
- 29. ¿Puede JRuby usar gemas de Ruby originales?
- 30. Beneficios y usos de un lenguaje de programación funcional
@ Daniel Spiewak - argh me ganas! Tienes que ser rápido en este lugar ;-) – johnstok
jaja. Tengo suerte, supongo. :-) ¡Mejor suerte la próxima vez! –
Estoy de acuerdo, si uno realmente quiere aprender funcional debería probar Haskell. – Jonke