Dado que Ruby tiene una buena capacidad de operación de lista incorporada: reducir, asignar, seleccionar, recopilar, etc. Tiene Procs, Blocks y Lambdas, y tiene un buen soporte de iteración (la each
familia), sería una mala decisión de diseño si intento escribir todas mis cosas de Ruby de la manera más puramente funcional posible? ¿Especialmente para el código que tiene poca o ninguna E / S (por lo tanto, efectos secundarios menos obvios)?
He estado aprendiendo Haskell (llamado el lenguaje 'real' de Hacker), y estoy enamorado de su forma de hacer las cosas. Amo a Ruby, pero creo que puede ser aún más divertido cuando fluye más espíritu Haskell (bueno, didn ¿Ruby pide prestado / aprende mucho de él en primer lugar?)
La orientación constructiva es bienvenida ...
fuente
Respuestas:
He estado haciendo esto con Python. Me parece engorroso escribir en un estilo funcional hereditariamente puro en un lenguaje que no fue diseñado para ello. Por ejemplo, contraste las dos definiciones de in_order :
Escribir a
in_order
la manera de Haskell en python va a ser tanto detallado (ya que python no admite muy bien los modismos necesarios) como lento (espacio lineal en lugar del espacio constante de Haskell debido a la pereza).Sin embargo, he tenido éxito creando programas de Python con organización funcional y una implementación idiomática de cada función. La idea de que esta es una buena manera de programar es en realidad la tesis detrás de mi proyecto de codecatalog . Por lo tanto, mis componentes están orientados a abstracciones y funciones (con interfaz pura ) que operan en ellos, en lugar de clases con estado, y se combina muy bien. De hecho, el código organizado de esta manera parece ser más flexible para reutilizar que el código organizado con clases. Sin embargo, eso podría ser un sesgo personal, ya que todavía soy un devoto de Haskell.
Entonces diría que la respuesta a tu pregunta es un poco . Usa tus raíces funcionales para ayudarte a pensar, pero no exageres. P.ej. simular listas perezosas en Ruby solo por el bien del idioma probablemente sea más problemático de lo que vale.
fuente
and
consumirlos; se comportará como un bucle. Mientras que la lista de comparaciones de Python tendrá que ser generada en su totalidad antes de que el análogoand
pueda ver cualquiera de ellos (a menos que use generadores ... lo que supongo que es una posibilidad).Puede escribir código Ruby en estilo funcional como si fuera Scheme, no Haskell. Para escribirlo como si fuera Haskell, necesitaría un sistema de tipo similar a Haskell, además de una evaluación generalizada y diferida.
fuente
He encontrado que la comprensión de la programación funcional, y de Haskell en particular, me ha sido útil en ciertas situaciones que he encontrado en Ruby. Pero cuanto más aprendo a Haskell, más me doy cuenta de cuán lejos está Ruby de poder ser muy parecido a Haskell.
La situación de carga del módulo / código es abismal, por un lado. El intérprete actual no tiene activada la optimización de llamadas de cola, por lo que no puede usar la recursión como lo hace en Haskell. Y una vez que entras en Monads, realmente no hay comparación de los niveles de abstracción que puedes lograr en Haskell vs.Ruby.
Si está interesado, he estado publicando un código de comparación Ruby / Haskell en gist.github.com como he estado aprendiendo.
La técnica que he traído a Ruby que ha funcionado mejor ha sido encontrar funciones puras donde puedo, que es lo que parece que estás tratando de hacer.
fuente
self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])
. No hay ninguna razón por la cual no pueda usar conscientemente mónadas, en lugar de usarlas sin siquiera saber que las está usando (como listas).Yo diría que sí". De lo que (creo) que estás hablando es de la influencia de la programación funcional en el lenguaje ruby. El paradigma funcional tiene algunos conceptos realmente agradables que complementan o se superponen con la orientación a objetos (sin efectos secundarios, en particular).
Lo mejor de Ruby es que le permite codificar en un estilo lineal, orientado a objetos o funcional, o una combinación de estos. Y su secuencia de comandos lineal simple puede transformarse en estilo OO / funcional si aumenta la complejidad.
fuente
Depende de si vas a colaborar con otros. Si está trabajando en el código usted mismo, use el estilo con el que se sienta más cómodo. Sin embargo, si está trabajando con otros programadores de Ruby, es posible que no estén acostumbrados a un estilo de programación puramente funcional y que su código los confunda. Por otra parte, si sus colaboradores también son programadores de Haskell que migraron a Ruby, es posible que no tenga este problema.
fuente