¿Estaría bien si decido escribir todo mi Ruby como si fuera Haskell?

10

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 eachfamilia), 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 ...

nemesisfixx
fuente
13
¿Por qué no escribir en Haskell entonces?
1
Escribiría solo en Haskell, pero Ruby no es tan malo como para merecer ser desechado por completo. Me gusta el hecho de que puedo usarlo cuando escribo scripts, y para los muchos experimentos rápidos, me gusta hackear juntos al aprender cosas de IA. Pero probablemente también porque acabo empecé a aprender Haskell, podría seguir el consejo que finalmente :-)
nemesisfixx
2
No entiendo por qué estás pidiendo el permiso de Stack Overflow. Si está escribiendo código que va a compartir con otros en un equipo, tendrá que coordinar sus estilos de codificación de todos modos. De lo contrario, ¿qué importa?
Mike Daniels
¿Por qué pregunto SO? porque respeto la honesta opinión de hackers y programadores experimentados. Puede haber beneficios al usar un enfoque puramente funcional para la programación que las mentes experimentadas podrían compartir conmigo (y con otras personas como yo).
nemesisfixx
Teniendo en cuenta que hay razones objetivas para "no", esta es una pregunta legítima.
Andrew Grimm

Respuestas:

16

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 :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Escribir a in_orderla 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.

luqui
fuente
De alguna manera tu descripción me hizo pensar en pascal.
rasjani
@rasjani, ¿oh? ¿Alguna razón por qué?
No lo sé, tal vez sea su falta de comprensión del inglés o lo que usted describió que se ajusta a cómo (al menos) las cosas se organizaron / estructuraron en unidades pascales. Solo una especie de conexión mental, podría no tener ninguna conexión real debido a la primera opción;)
rasjani
1
La afirmación "espacio lineal en lugar del espacio constante de Haskell debido a la pereza" no es precisa. La pereza todavía implica un orden lineal. Sin embargo, entiendo tu punto.
3
@ Aromero, no entiendo el tuyo. ¿Qué tiene que ver el orden con eso? El espacio constante proviene de la basura de Haskell que recoge los encabezados de la lista de comparaciones después de andconsumirlos; 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álogo andpueda ver cualquiera de ellos (a menos que use generadores ... lo que supongo que es una posibilidad).
7

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.

soldar
fuente
1

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
En una de mis pruebas de Smalltalk: 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).
Frank Shearar
0

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.

Robert Brown
fuente
0

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.

Zhehao Mao
fuente